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
为什么它的行为不同?
- 您能确保您提供的代码与您所声明的输出相匹配吗?上面的代码似乎不太可能生成"愚蠢、愚蠢、愚蠢"或"bob是愚蠢的"。
- 什么??该代码的输出有多可能是stupid stupid stupid或Bob is stupid?
- 我怀疑它会生成Go Go Go和Stack Over Go,但要发布生成您提到的输出的代码。
- var values=new list()"bob","is","duply"
- stackoverflow.com/questions/14907987/&hellip;
- 和blogs.msdn.com/b/ericlippert/archive/2009/11/12/&hellip;
- -1用于发布假代码。不要那样做!
- 哦,我真的很抱歉,在2010年的Visual Studio中,它让人去了。
- 好的,请取values=new list"bob","is","duply"并为复制粘贴导致的错误道歉……:(
原因是编译器被更改以创建在闭包中捕获的变量的临时副本。
在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编译器的行为出乎意料。
- + 1。另请参阅:Eric Lippert关于此主题的博客文章:blog s.msdn.com/b/ericlippet/archive/2009/11/12/&hellip;
- 停止在任何地方循环复制变量太好了——总是觉得必须一直这样做太愚蠢了。
- @额尔根:谢谢-我只是在搜索那个链接来添加一些官方内容。
- 好吧,如果我们是正式的,那么告诉你在Visual Studio 2010中c_和在Visual Studio 2012中c_之间的区别的页面将是一个很好的资源来查看/google。
- @Ta.speot.is:由于Eric是C团队的开发人员,这对我来说已经足够正式了。此外,它比概述更容易理解。
- 我的评论的意思是,如果你在Visual Studio 2012中搜索c的差异,并且可能会因为第二个链接而感到困扰,那么页面上的第一项就可以准确地解释这种行为。也就是说,代表某人的极度懒惰…
- @斯佩特:我真的不知道该如何接受你的评论。如果你是在暗示我懒惰-那太可笑了。如果你是在暗示行动是懒惰的-这是有争议的,但也不太公平。作为一个初学者,他很可能会被搜索结果和概述页面淹没。
- OP的问题可以通过谷歌搜索的第二个链接来回答。是的,他很懒。