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