Avatar ·

为什么在 C# 中 foreach 循环变量被 lambda 捕获时不正确?

大家好!我最近开始学习 C#,在使用 `foreach` 循环内的 lambda 表达式时遇到了一个非常奇怪的行为。 我有一个简单的代码,创建了一个操作列表,这些操作应该输出从 0 到 4 的数字: ```csharp var actions = new List(); for (int i = 0; i < 5; i++) { actions.Add(() => Console.WriteLine(i)); } foreach (var action in actions) { action(); } ``` 这段代码输出:5, 5, 5, 5, 5。我理解这是因为变量 `i` 是通过引用捕获的,当 lambda 被调用时,它已经等于 5。这很合理。 但是当我用 `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(); } ``` 在旧版本的 C#(5.0 之前)中,这段代码也输出 5, 5, 5, 5, 5。但从 C# 5.0 开始,它输出 0, 1, 2, 3, 4。 为什么会这样?因为在 `foreach` 中循环变