To działa prawidłowo (czyli zgodnie z oczekiwaniami) w C# 5.0:Schwytany Zamknięcie (Loop Variable) w C# 5.0
var actions = new List<Action>();
foreach (var i in Enumerable.Range(0, 10))
{
actions.Add(() => Console.WriteLine(i));
}
foreach (var act in actions) act();
Drukuje 0 do 9. Ale ten pokazuje 10 do 10 razy:
var actions = new List<Action>();
for (var i = 0; i < 10; i++)
{
actions.Add(() => Console.WriteLine(i));
}
foreach (var act in actions) act();
Pytanie: To był problem, który mieliśmy w wersjach C# przed 5.0; więc musieliśmy użyć lokalnego elementu zastępczego dla pętli i jest on teraz naprawiony - w C# 5.0 - w pętlach "foreach". Ale nie w pętlach "dla"!
Jaki jest tego powód (nie naprawiający problemu również dla pętli for
)?
Masz na myśli "co to za rozumowanie, że nie jest ustalone również dla pętli' for' "? –
Jestem zaskoczony, że działa nawet w pierwszym przypadku ... Od uruchomienia Akcji po wyjściu z zakresu foreach/for. 'Var i' nie powinien już istnieć. Dla mnie jest to bardzo "niebezpieczny" projekt. – LightStriker
@ LightStriker: Nie; to jest funkcja. Nazywa się to zamknięciem. – SLaks