¿Por qué en C# la variable del bucle foreach se captura incorrectamente por la lambda?
¡Hola a todos! Empecé a estudiar C# recientemente y me encontré con un comportamiento muy extraño al usar expresiones lambda dentro del bucle `foreach`.
Tengo un código simple donde creo una lista de acciones que deberían imprimir números del 0 al 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. Entiendo que esto se debe a que la variable `i` se captura por referencia, y para el momento de la llamada de las lambdas ya es igual a 5. Esto es lógico.
Pero cuando hago lo mismo con `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();
}
```
En versiones antiguas de C# (anteriores a 5.0) este código también imprimía 5, 5, 5, 5, 5. Pero a partir de C# 5.0 imprime 0, 1, 2, 3, 4.
¿Por qué sucede esto? Ya que en `foreach` la variable del bucle