Heim > Artikel > Backend-Entwicklung > Warum erfasst ein Lambda-Ausdruck während jeder Iteration in einer foreach-Schleife den Endwert einer Iteratorvariablen anstelle ihres Werts?
Unerwartetes Verhalten in Lambda-Ausdrücken unter Verwendung der Iteratorvariablen
Im angegebenen Code lautet die erwartete Ausgabe beim Aufruf von myClass.Execute() „Hi String“, „Hi Single“, „Hi Int32.“ Der Code gibt jedoch dreimal „Hi Int32“ aus. Warum tritt dieses unerwartete Verhalten auf und wie kann es korrigiert werden?
Das Problem liegt im Lambda-Ausdruck, der in der foreach-Schleife verwendet wird:
var sayHello = new PrintHelloType(greeting => SayGreetingToType(type, greeting));
In diesem Code ist der Schleifenvariablentyp wird vom Lambda-Ausdruck erfasst. Was jedoch erfasst wird, ist nicht der Wert von „type“ bei der spezifischen Iteration, sondern der Verweis auf die Variable selbst.
Wenn der PrintHelloType-Delegat später aufgerufen wird, verwendet er daher den Wert von „type“ am Ende von die Schleife, die „Int32“ ist. Dies führt zu einer unerwarteten Ausgabe.
Lösung:
Um das gewünschte Ziel zu erreichen, kann eine neue Variable verwendet werden, um den Wert von Typ während jeder Iteration zu erfassen:
foreach (var type in types) { var newType = type; var sayHello = new PrintHelloType(greeting => SayGreetingToType(newType, greeting)); helloMethods.Add(sayHello); }
Jetzt erfasst jeder Lambda-Ausdruck den Wert von newType, der der richtige Wert für die spezifische Iteration ist. Anschließend wird die erwartete Ausgabe erzeugt: „Hi String“, „Hi Single“, „Hi Int32.“
Das obige ist der detaillierte Inhalt vonWarum erfasst ein Lambda-Ausdruck während jeder Iteration in einer foreach-Schleife den Endwert einer Iteratorvariablen anstelle ihres Werts?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!