Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在VS2012和VS2010上运行相同的程序会表现出不同的行为_C#_.net_Visual Studio 2010_Visual Studio 2012 - Fatal编程技术网

C# 在VS2012和VS2010上运行相同的程序会表现出不同的行为

C# 在VS2012和VS2010上运行相同的程序会表现出不同的行为,c#,.net,visual-studio-2010,visual-studio-2012,C#,.net,Visual Studio 2010,Visual Studio 2012,我的盒子上安装了.NET4.5,我知道下面的行为与foreach捕获.NET3.5和4之间闭包的方式不同有关 我想更好地理解为什么在使用.net Framework 4编译时,在VS 2012和VS2010中运行相同的代码会显示不同的输出。在这两种情况下,VS 2012是否运行带有某种特殊标志的csc,导致它捕获闭包 var words = new[] { "foo", "bar", "baz", "beer" }; var actions = new List<Action>();

我的盒子上安装了.NET4.5,我知道下面的行为与foreach捕获.NET3.5和4之间闭包的方式不同有关

我想更好地理解为什么在使用.net Framework 4编译时,在VS 2012和VS2010中运行相同的代码会显示不同的输出。在这两种情况下,VS 2012是否运行带有某种特殊标志的csc,导致它捕获闭包

var words = new[] { "foo", "bar", "baz", "beer" };
var actions = new List<Action>();
foreach (string word in words)
{
    actions.Add(() => Console.WriteLine(word));
}

actions.ForEach(e => e());
var words=new[]{“foo”、“bar”、“baz”、“beer”};
var actions=新列表();
foreach(单词中的字符串)
{
actions.Add(()=>Console.WriteLine(word));
}
actions.ForEach(e=>e());
输出:使用VS2010和.NET4,上面的程序可以产生4倍的“啤酒”

使用VS2012和.net 4:

福巴啤酒


对此的修复不是.NET4的一部分,而是C#5的一部分。因此,影响此代码行为的是您正在使用的编译器,而不是目标框架版本


这是一个讨论,并正式宣布。

微软在VS2012中修复了它,这是一个巨大的错误。我不知道,微软在VS2010上一个SP中修复了它吗?。如果您测试过,请通知我们

考虑展示你在每个人身上看到的行为……出于好奇,哪个做什么?(每个的输出是什么?)它被更改为C#5,VS 2012默认使用新的C#编译器:更正:但是.net 4.5不是.net 4的就地替代品吗。因此,基于这一点,无论我是从VS 2012还是VS 2010运行程序,编译器位都是相同的?@Rohitharma-你为什么说4.5是4的替代品?我不认为它是,它只是一个更新的版本。微软目前支持2.0、3.0、3.5、4.0、4.5、4.5.1和4.5.2。如果您想要4.0行为,您可以在VS 2012的构建中始终以4.0框架为目标;你只是不能在2010年瞄准4.5。请看@RohitSharma:改变目标框架不会改变编译器,它会改变运行时。不是一个bug,而是一个设计决策。微软改变了C#5的设计,但他们没有,我相信也不会,对早期的编译器进行改进。因此,C#4编译器将始终显示原始捕获行为。