Why different versions of Visual Studio will output different result of the same code?
我使用.NET 4(不是.NET 4.5或任何其他版本的框架!)
为什么不同版本的Visual Studio会使用相同的.NET框架输出相同代码的不同结果?
我有以下内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| static void Main (string[] args )
{
var values = new List <int>() { 1, 2, 3, 4, 5 };
var funcs = new List <Func <int>>();
foreach (var v in values ) {
funcs .Add(() => v * 10);
}
foreach (var f in funcs ) {
Console .WriteLine(f ());
}
Console .ReadKey();
} |
在Visual Studio 2013中,输出为10 20 30 40 50(target.net v==4)。在Visual Studio 2010中,输出为50 50 50 50 50(target.net v==4)。
问题出在哪里?如何识别C(而不是.NET!)每个Studio用于.NET 4的版本
C:\Windows\Microsoft.NET\Framework\v4.0.30319>csc /?
Microsoft (R) Visual C# Compiler version 4.0.30319.33440
for Microsoft (R) .NET Framework 4.5
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>csc /?
Microsoft (R) Visual C# Compiler version 4.0.30319.33440
for Microsoft (R) .NET Framework 4.5
C:\Program Files (x86)\Microsoft Visual Studio 12.0>csc /?
Microsoft (R) Visual C# Compiler version 12.0.30110.0
for C# 5
编辑
我可以这么说吗?
1 2
| VS 2010 == C# 4
VS 2013 == C# 5 |
这与具体解决方案的目标框架无关吗?
- 我在我的机器上显示csc /?的输出
- 我想这可以解释为在C 5中foreach对变量的使用是否发生了变化?.
- @哈比卜不是复制品。我的问题是为什么针对相同.NET的不同Visual Studio输出不同的结果
- @Serhio,主要原因是Visual Studio 2013默认使用C_5.0编译器。这就是为什么重复链接的问题。
- 尝试删除()=>。
- @Habib当我以.NET 4框架为目标时,它还使用C 5编译器?
- @Serhio,见Jon Skeet解开版本
- 答案是"否",使用引用程序集。而VS2010不适用于.NET 4.5引用程序集,因此无法使用VS2010编译.NET 4.5应用程序。
- 是的,目标框架不会更改所使用的编译器。
- @是的,如果你的目标是.NET 2.0,它仍然会使用C 5编译器。编译器版本和框架版本完全独立。编译器版本由您使用的VS版本决定,但它是固定的,框架版本可以由项目设置。
- 问题现在错了。2013自动安装框架4.5.1和目标
- @ofiris,忘记.NET 4.5,我在这个例子中不使用它
来自埃里克·利珀特的博客:
In C# 5, the loop variable of a foreach will be logically inside the
loop, and therefore closures will close over a fresh copy of the
variable each time.
以及一份来自msdn的报价:
Visual Studio 2010 will not let you develop using C# 5. The new C# 5
language features are part of the compiler, and will be included in
the Visual Studio 2012 compiler. Even if you install .NET 4.5, this
will not let you take advantage of the new features of the language
(such as async/await), as these require a new compiler to use.
VS2013只与C# 5.0编译器一起工作,您可以针对各种.NET框架。因此,您可以使用get c_5.0特性,如async/await,并且仍然以.NET 4.0为目标。
- 当我将vs 2013作为.NET 4框架的目标时,它还使用了C 5编译器?
- @是的,对。VS2013只与C_5.0编译器一起工作,您可以针对各种.NET框架。因此,您可以使用get c_5.0特性,如async/await,并且仍然以.NET 4.0为目标。
- 在答案中添加了评论,非常相关。
- 好的,但是我的CSC输出如何?它说它使用C 4??
- 你从哪里来的?对于VS2013,使用EDOCX1[1]
- @正如你在文章中看到的,我从C:\Windows\Microsoft.NET\Framework\v4.0.30319>csc /?上运行它。
- @YK1尝试过,但我不能使用Async/Await目标.NET 4,因为在该框架中不存在Async Await使用的所有类型。
- @serhio:要获取async/await所需的类型,请添加nuget包microsoft.bcl.async。参见stackoverflow.com/questions/22060691/&hellip;
- vs 2013使用C编译器v12(!)(对于C 5),但是vs 2013甚至没有指明使用的C版本,只是编译器版本4…(见我的编辑)
- @Serhio:.NET 4.5只是一个营销名称,就像Windows Vista实际上是Windows Vesion 6.0,Windows 7实际上是版本6.1。C编译器和其他系统程序集(如.NET 4.5的clr.dll)的实际版本是4.0.30319.17929及更高版本。版本13.0与msbuild的toolsversion更相关。从VS2013年起,微软将在Visual Studio中发布msbuild,这与以前.NET Framework版本中发布的msbuild不同。
- 我不知道是不是"更相关",但我看到了C编译器版本和C(?)之间的区别。!)版本,.NET版本,以及vs版本…一团糟…
- @是的,C版是市场名称。C编译器版本是内部版本-他们可以更新/修复。他们不能修改营销名称。我不明白你的困惑是什么。总之,一个修正,vs2013 toolsversion是12.0-而不是13.0。