在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();
Run Code Online (Sandbox Code Playgroud)
上面的代码产生了一个奇怪的结果(我使用的是.NET 4.5编译器):
1
2
5
5
Run Code Online (Sandbox Code Playgroud)
为什么i两个几乎相同的循环捕获的值不同?