Avatar ·

Warum wird die foreach-Schleifenvariable in C# in einem Lambda-Ausdruck als Referenz erfasst?

Hallo zusammen! Ich bin ein Anfänger in C# und bin auf ein sehr seltsames Verhalten gestoßen, als ich foreach zusammen mit Lambda-Ausdrücken verwendet habe. Ich habe diesen Code: ```csharp var actions = new List(); var numbers = new List { 1, 2, 3, 4, 5 }; foreach (var number in numbers) { actions.Add(() => Console.WriteLine(number)); } foreach (var action in actions) { action(); } ``` Ich erwartete, dass auf der Konsole ausgegeben wird: ``` 1 2 3 4 5 ``` Aber stattdessen sehe ich: ``` 5 5 5 5 5 ``` Warum passiert das? Ich habe gelesen, dass es damit zusammenhängt, wie C# die Schleifenvariable in foreach behandelt. Aber ich verstehe nicht, warum sie sich bei jeder Iteration wie "dieselbe" Variable verhält, anstatt neu erstellt zu werden. In einer for-Schleife funktioniert, soweit ich weiß, alles normal. Kann mir jemand erklären, worum es hier geht? Und vor allem – wie kann ich diesen Code korrigieren, um das erwartete Ergebnis zu erhalten? Vielen Dank im Voraus! <<>>

Ursache des Problems: