Делегат действия использует последние значения переменных, объявленные вне цикла 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

Ответы на вопрос(3)

Ваш ответ на вопрос