在Visual Studio 2010和2012中找到不同的答案

时间:2013-02-25 11:31:33

标签: c# visual-studio-2010 visual-studio-2012

以下是示例代码。

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

为什么表现不同?

1 个答案:

答案 0 :(得分: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编译器的行为意外。