3

这是示例代码。

var values = new List<string>() { "Stack", "Over", "Go" };

var funcs = new List<Func<string>>();

foreach(var v in values) 

  funcs.Add( ()=>v );
foreach(var f in funcs) 

  Console.WriteLine(f());

当我使用 Visual Studio 2010 运行此代码时,我得到的输出为: Go Go Go

但是当我在 Visual Studio 2012 中尝试相同的代码时,输​​出是: Stack Over Go

为什么它的行为不同?

4

1 回答 1

10

原因是编译器被更改为创建在闭包中捕获的变量的临时副本。

在 VS 2012 中使用以下代码:

foreach(var v in values) 
    funcs.Add(() => v);

VS 2012 编译器由此生成的代码等同于 VS 2010 编译器为此代码生成的代码:

foreach(var v in values) 
{
    var tmp = v;
    funcs.Add(() => tmp);
}

进行此更改的原因是许多开发人员发现 VS 2010 编译器的行为出乎意料。

于 2013-02-25T11:33:56.387 回答