Avatar ·

¿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