Avatar ·

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