这工作正常(意味着如预期)在C#5.0:捕获封闭(循环变量)在C#5.0
var actions = new List<Action>();
foreach (var i in Enumerable.Range(0, 10))
{
actions.Add(() => Console.WriteLine(i));
}
foreach (var act in actions) act();
打印0到9但这一个示出了10 10次:
var actions = new List<Action>();
for (var i = 0; i < 10; i++)
{
actions.Add(() => Console.WriteLine(i));
}
foreach (var act in actions) act();
问题:这是我们在5.0之前的C#版本中遇到的问题;所以我们必须为闭包使用循环局部占位符,并且现在在C#5.0中已经修复 - 在“foreach”循环中。但不是在“for”循环中!
这是什么原因(不解决for
循环的问题)?
你的意思是“它为什么不被固定for'循环以及”? – 2013-04-28 15:15:49
我很惊讶它甚至在第一种情况下工作...因为您在退出foreach/for的范围后运行该操作。 'var i'不应该存在了。对我而言,这是一个非常“危险”的设计。 – LightStriker 2013-04-28 15:17:13
@LightStriker:不;这是一个功能。这就是所谓的封闭。 – SLaks 2013-04-28 15:18:28