Por que em C# a variável do loop foreach é capturada incorretamente pela lambda?
Olá a todos! Comecei a estudar C# recentemente e me deparei com um comportamento muito estranho ao usar expressões lambda dentro do loop `foreach`.
Tenho um código simples onde crio uma lista de ações que devem imprimir números de 0 a 4:
```csharp
var actions = new List();
for (int i = 0; i < 5; i++)
{
actions.Add(() => Console.WriteLine(i));
}
foreach (var action in actions)
{
action();
}
```
Este código imprime: 5, 5, 5, 5, 5. Entendo que isso ocorre porque a variável `i` é capturada por referência, e no momento da chamada das lambdas ela já é igual a 5. Isso é lógico.
Mas quando faço o mesmo com `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();
}
```
Em versões antigas do C# (anteriores à 5.0), este código também imprimia 5, 5, 5, 5, 5. Mas a partir do C# 5.0 ele imprime 0, 1, 2, 3, 4.
Por que isso? Afinal, no `foreach` a variável do loop