【发布时间】:2016-05-23 18:21:33
【问题描述】:
在 C# 中尝试使用闭包时,我发现如果它们在循环中捕获迭代器变量,它们会非常意外地工作。
var actions = new List<Action>();
foreach (int i in new[] { 1, 2 })
actions.Add(() => Console.WriteLine(i));
for (int i = 3; i <= 4; i++)
actions.Add(() => Console.WriteLine(i));
foreach (var action in actions)
action();
上面的代码产生了一个奇怪的结果(我使用的是 .NET 4.5 编译器):
1
2
5
5
为什么 2 个几乎相同的循环捕获的 i 的值不同?
【问题讨论】:
-
你很聪明地注意到了这种微妙的区别。是的,这里有一个危险,有人可以将 foreach 重构为 for 而没有意识到他们正在引入语义更改!我很想知道您是否有“for”案例的“真实世界”用例,特别是“for”的奇怪行为是所需行为的案例。