Der Codeausschnitt demonstriert das unerwartete Verhalten bei Verwendung der Iteratorvariablen einer foreach-Schleife in einem Lambda-Ausdruck. Bei der Ausführung wird statt „Hi String“, „Hi Single“ und „Hi Int32“ „Hi Int32“ für alle drei Methoden ausgegeben.
Dieses Verhalten ist darauf zurückzuführen die Natur von Lambda-Ausdrücken und ihren erfassten Variablen. Wenn ein Lambda-Ausdruck innerhalb einer Schleife definiert wird, erfasst er die Referenz der Schleifenvariablen, nicht ihren Wert. Infolgedessen verweist es während der gesamten Schleifeniterationen auf dieselbe Variable.
Im bereitgestellten Code wird der Variablentyp durch den Lambda-Ausdruck erfasst. Der Code berücksichtigt jedoch nicht die Tatsache, dass alle Iterationen der Schleife denselben Verweis auf den Typ gemeinsam nutzen. Folglich erfasst jeder Lambda-Ausdruck letztendlich den Wert des Typs aus der letzten Iteration, was zu unerwarteten Ausdrucken führt.
Um dieses Problem zu lösen und das gewünschte Ziel zu erreichen, müssen Sie sicherstellen dass jeder Lambda-Ausdruck einen eindeutigen Typwert erfasst. Erstellen Sie dazu für jede Iteration eine neue Variable und weisen Sie ihr den aktuellen Wert des Typs zu:
foreach (var type in types) { var newType = type; var sayHello = new PrintHelloType(greeting => SayGreetingToType(newType, greeting)); helloMethods.Add(sayHello); }
Durch die Verwendung von newType erstellen Sie effektiv eine Kopie des Typs und erfassen seinen Wert aus der aktuellen Iteration. Dadurch wird sichergestellt, dass jeder Lambda-Ausdruck einen eindeutigen Verweis auf seinen eigenen Typwert hat, was zur korrekten Ausgabe führt.
Das obige ist der detaillierte Inhalt vonWarum erfasst mein Lambda-Ausdruck den letzten Wert einer Schleifenvariablen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!