Raj*_*jan 2 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());
Run Code Online (Sandbox Code Playgroud)
当我使用visual studio 2010运行此代码时,我得到的输出为:
Go Go Go
但是当我在visual studio 2012中尝试相同的代码时,输出是:
Stack Over Go
为什么表现不一样?
Dan*_*rth 10
原因是编译器已更改为创建在闭包中捕获的变量的临时副本.
在VS 2012中使用以下代码:
foreach(var v in values)
funcs.Add(() => v);
Run Code Online (Sandbox Code Playgroud)
VS 2012编译器从中生成的代码等同于VS 2010编译器为此代码生成的代码:
foreach(var v in values)
{
var tmp = v;
funcs.Add(() => tmp);
}
Run Code Online (Sandbox Code Playgroud)
这种变化的原因是许多开发人员发现VS 2010编译器的行为出乎意料.
| 归档时间: |
|
| 查看次数: |
234 次 |
| 最近记录: |