关于C#:在Visual Studio 2010和2012中查找不同的答案

Finding different answer in Visual studio 2010 and 2012

本问题已经有最佳答案,请猛点这里访问。

这是示例代码。

1
2
3
4
5
6
7
8
9
10
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

为什么它的行为不同?


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

在vs 2012中采用以下代码:

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

vs 2012编译器由此生成的代码与vs 2010编译器为此代码生成的代码相同:

1
2
3
4
5
foreach(var v in values)
{
    var tmp = v;
    funcs.Add(() => tmp);
}

这种变化的原因是,许多开发人员发现Vs2010编译器的行为出乎意料。