我只是写了一些快速的代码,注意到这个编译器错误
Using the iteration variable in a lambda expression may have unexpected results.
Instead,create a local variable within the loop and assign it the value of the iteration variable.
我知道它的意思,我可以很容易地解决它,不是一个大事。
但我想知道为什么在lambda中使用迭代变量是个坏主意?
我可以在以后引起什么问题?
考虑这个代码:
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,十次。这是因为只有一个变量被所有的代表捕获。这是一种意想不到的行为。
编辑:我刚刚看到你在谈论VB.NET而不是C#。我相信VB.NET有更复杂的规则,由于变量在迭代中保持它们的值。 This post by Jared Parsons给出了一些关于所涉及的困难的信息 – 虽然它回到2007年,所以实际行为可能已经改变了。