我遇到了一个关于C#的有趣问题。我有像下面的代码。C中循环捕获变量#
List<Func<int>> actions = new List<Func<int>>();
int variable = 0;
while (variable < 5)
{
actions.Add(() => variable * 2);
++ variable;
}
foreach (var act in actions)
{
Console.WriteLine(act.Invoke());
}
我期望它输出0,2,4,6,8,但是,它实际上输出5分10秒。
看来,这是由于所有操作引用一个捕获变量。结果,当它们被调用时,它们都具有相同的输出。
有没有办法绕过此限制让每个动作实例都有自己的捕获变量?
另请参见Eric Lippert关于此主题的博客系列:[关闭循环变量被视为有害](http://blogs.msdn.com/b/ericlippert/archive/tags/closures/) – Brian 2010-11-11 21:50:50
此外,他们正在改变C#5按照您的预期在foreach内工作。 (突破变化) – 2012-03-04 18:55:00
相关:[为什么这是一个不好用的迭代变量在一个lambda表达式](http://stackoverflow.com/questions/227820/why-is不好使用迭代变量的lambda表达式) – nawfal 2013-11-02 07:08:51