以下是示例代码。
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
为什么表现不同?
答案 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编译器的行为意外。