Avatar ·

Por que em C# a variável do loop foreach é capturada por referência em uma expressão lambda?

Olá a todos! Sou um desenvolvedor C# iniciante e me deparei com um comportamento muito estranho ao usar foreach junto com expressões lambda. Tenho o seguinte código: ```csharp var actions = new List(); var numbers = new List { 1, 2, 3, 4, 5 }; foreach (var number in numbers) { actions.Add(() => Console.WriteLine(number)); } foreach (var action in actions) { action(); } ``` Eu esperava que no console fosse exibido: ``` 1 2 3 4 5 ``` Mas, em vez disso, vejo: ``` 5 5 5 5 5 ``` Por que isso acontece? Li que está relacionado a como o C# trata a variável do loop no foreach. Mas não entendo por que ela se comporta como uma variável "única" em cada iteração, em vez de ser criada novamente. No loop for, pelo que sei, tudo funciona normalmente. Alguém pode explicar qual é o problema? E, o mais importante, como corrigir esse código corretamente para obter o resultado esperado? Desde já, obrigado! <<>>

Causa do problema: