为什么在 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` 中循环变