Делегат действия использует последние значения переменных, объявленные вне цикла foreach.
У меня есть этот кусок кода:
int i = 0;
foreach(var tile in lib.dic.Values)
{
var ii = i;
var t = tile;
Button b = new Button( () = > { MainStatic.tile = t; } );
Checkbox c = new Checkbox( () = > { lib.arr[ii].b = !lib.arr[ii].b; } );
i++;
}
Хотя приведенный выше код работает как следует, этот фрагмент ниже:…
int i = 0;
foreach(var tile in lib.dic.Values)
{
Button b = new Button( () = > { MainStatic.tile = tile; } );
Checkbox c = new Checkbox( () = > { lib.arr[i].b = !lib.arr[i].b; } );
i++;
}
всегда будет выполнять делегатов с последними значениямиi
а такжеtile
переменные. Почему это происходит, и почему я должен делать локальную копию этих переменных, особенно не ссылочного типа?int i