Следующий код выводит 33 вместо 012. Я не понимаю, почему новая переменная loopScopedi не фиксируется на каждой итерации, а не захватывает одну и ту же переменную.C# Объявление переменных внутри лямбда-выражений
Action[] actions = new Action[3];
for (int i = 0; i < 3; i++)
{
actions [i] =() => {int loopScopedi = i; Console.Write (loopScopedi);};
}
foreach (Action a in actions) a(); // 333
Скорее всего, этот код производит 012. В чем разница между этими двумя?
Action[] actions = new Action[3];
for (int i = 0; i < 3; i++)
{
int loopScopedi = i;
actions [i] =() => Console.Write (loopScopedi);
}
foreach (Action a in actions) a(); // 012
А это модифицированная проблема закрытия - см. Http://stackoverflow.com/questions/235455/access-to-modified-closure –
Проблема закрытия: http://www.codethinked.com/c-closures-explained например. Поведение отличается от .net < 4.5 and > = 4.5 –
Прочтите эти 2 записи от Эрика Липперта http://blogs.msdn.com/b/ericlippert/archive/2009/11/16/closing-over-the-loop-variable -part -two.aspx и http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx – Icarus