Avatar ·

Pourquoi la variable de boucle foreach en C# est-elle capturée incorrectement par une lambda ?

Bonjour à tous ! J'ai commencé à étudier C# récemment et j'ai rencontré un comportement très étrange lors de l'utilisation d'expressions lambda à l'intérieur d'une boucle `foreach`. J'ai un code simple où je crée une liste d'actions qui doivent afficher les nombres de 0 à 4 : ```csharp var actions = new List(); for (int i = 0; i < 5; i++) { actions.Add(() => Console.WriteLine(i)); } foreach (var action in actions) { action(); } ``` Ce code affiche : 5, 5, 5, 5, 5. Je comprends que c'est parce que la variable `i` est capturée par référence, et au moment de l'appel des lambdas, elle vaut déjà 5. C'est logique. Mais quand je fais la même chose avec `foreach` : ```csharp var actions = new List(); foreach (var i in Enumerable.Range(0, 5)) { actions.Add(() => Console.WriteLine(i)); } foreach (var action in actions) { action(); } ``` Dans les anciennes versions de C# (avant 5.0), ce code affichait aussi 5, 5, 5, 5, 5. Mais à partir de C# 5.0, il affiche 0, 1, 2, 3, 4. Pourquoi ? En effet, dans `foreach`, la variable de boucle