Poniższy kod wyprowadza 33 zamiast 012. Nie rozumiem dlaczego nowa zmienna loopScopedi nie jest przechwytywana w każdej iteracji, zamiast przechwytywania tej samej zmiennej.C# deklaracja zmiennych wewnątrz wyrażeń lambdy
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
Hopwever, ten kod generuje 012. Jaka jest różnica między tymi dwoma?
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
Ah to jest zmodyfikowany problem zamknięcia - patrz http://stackoverflow.com/questions/235455/access-to-modified-closure –
Problem zamknięcia: http://www.codethinked.com/c-closures-explained na przykład. Zachowanie jest inne w .net < 4.5 and > = 4.5 –
Przeczytaj te 2 wpisy z Eric Lippert http://blogs.msdn.com/b/ericlippert/archive/2009/11/16/closing-over-to-loop-variable-part -dwa.aspx i http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx – Icarus