vb.net – 为什么在lambda表达式中使用迭代变量很不好

我只是写了一些快速代码,注意到这个编译器错误

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年,所以实际行为可能已经改变了。

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...