为什么在lambdaexpression式中使用迭代variables是不好的

我只是写了一些简单的代码,并注意到这个编译器错误

在lambdaexpression式中使用迭代variables可能会有意想不到的结果。
相反,在循环中创build一个局部variables并为其分配迭代variables的值。

我知道这意味着什么,我可以很容易地解决这个问题,而不是一个大问题。
但我想知道为什么在lambda中使用迭代variables是一个坏主意?
我以后可能会造成什么问题?

考虑这个代码:

List<Action> actions = new List<Action>(); for (int i=0; i < 10; i++) { actions.Add(() => Console.WriteLine(i)); } foreach (Action action in actions) { action(); } 

你期望打印什么? 显而易见的答案是0 … 9 – 但实际上它打印10次,10次。 这是因为只有一个variables被所有的代表所捕获。 这是出乎意料的这种行为。

编辑:我刚刚看到你说的是VB.NET而不是C#。 我相信VB.NET有更复杂的规则,因为variables在迭代中保持其值。 Jared Parsons的这篇文章提供了一些有关困难的信息 – 虽然从2007年开始,但实际行为可能从那时起就发生了变化。

假设你的意思是C#在这里。

这是因为编译器实现闭包的方式。 使用迭代variables可能会导致访问修改的闭包的问题(请注意,我说'可以'不会'会导致一个问题,因为有时它不会发生取决于方法中的其他东西,有时你真的想访问修改的闭包)。

更多信息:

http://blogs.msdn.com/abhinaba/archive/2005/10/18/482180.aspx

更多信息:

http://blogs.msdn.com/oldnewthing/archive/2006/08/02/686456.aspx

http://blogs.msdn.com/oldnewthing/archive/2006/08/03/687529.aspx

http://blogs.msdn.com/oldnewthing/archive/2006/08/04/688527.aspx