【问题标题】:Running same program on VS2012 and VS2010 exhibits different behavior在 VS2012 和 VS2010 上运行相同的程序表现出不同的行为
【发布时间】:2014-05-20 02:15:00
【问题描述】:

我的盒子上安装了 .net 4.5,并且我知道以下行为与 foreach 捕获 .net 3.5 和 4 之间关闭方式的差异有关。

我想更好地理解为什么在 VS 2012 和 VS2010 中运行相同的代码在两种情况下都使用 .net Framework 4 进行编译时会显示不同的输出,是不是 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());

输出:使用 VS2010 和 .net 4,上述程序产生“啤酒”4 次

使用 VS2012 和 .net 4:

foo bar baz 啤酒

【问题讨论】:

  • 考虑展示你在每个中看到的行为...
  • 出于好奇,哪个做什么? (每个的输出是什么?)
  • 针对 C# 5 进行了更改,VS 2012 默认使用新的 C# 编译器:stackoverflow.com/questions/8898925/…

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


【解决方案1】:

对此的修复不是 .Net 4 的一部分,而是 C# 5 的一部分。因此,影响此代码行为的是您使用的编译器,而不是您所针对的框架版本。

这是在讨论here,并正式宣布here。

【讨论】:

  • 更正我:但 .net 4.5 不是 .net 4 的就地替代品。因此,无论我从 VS 2012 还是 VS 2010 运行程序,编译器位都是相同的?
  • @RohitSharma - 是什么让你说 4.5 是 4 的替代品?我不认为它是,它只是一个较新的版本。 Microsoft 当前支持 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:改变目标框架不会改变编译器,它会改变运行时。
【解决方案2】:

这是一个错误,微软在 VS2012 中修复了它。我不知道,微软是否在 Last SP 的 VS 2010 中修复了它?如果您测试它,请通知我们。

【讨论】:

  • 不是错误,而是设计决定。 Microsoft 更改了 C# 5 中的设计,但他们没有,而且我相信也不会对早期编译器的更改进行改进。因此,C# 4 编译器将始终显示原始捕获行为。
猜你喜欢
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
相关资源
最近更新 更多