为什么不同版本的Visual Studio会输出相同代码的不同结果?
我使用.NET 4 ( 不是.NET 4.5或任何其他版本的框架!)
为什么不同版本的Visual Studio将使用SAME .NET Framework输出相同代码的不同结果?
我有以下内容
static void Main(string[] args) { var values = new List() { 1, 2, 3, 4, 5 }; var funcs = new List<Func>(); 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
(目标.NET v == 4)。
在Visual Studio 2010中 ,输出为50 50 50 50 50
(目标.NET v == 4)。
问题出在哪儿? 如何识别每个Studio
用于.NET 4
的C# (不是.NET!)版本
C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319> csc /?
Microsoft(R)Visual C#编译器版本4.0.30319.33440
适用于Microsoft(R).NET Framework 4.5C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC> csc /?
Microsoft(R)Visual C# 编译器版本4 .0.30319.33440
适用于Microsoft(R).NET Framework 4.5C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 > csc /?
Microsoft(R)Visual C# 编译器版本12 .0.30110.0
对于C#5
编辑
我可以这么说吗
VS 2010 == C# 4 VS 2013 == C# 5
这与具体解决方案的目标框架无关?
来自Eric Lippert的博文 :
在C#5中,foreach的循环变量将在逻辑上位于循环内部,因此闭包每次都会关闭变量的新副本。
来自MSDN的引用:
Visual Studio 2010不允许您使用C#5进行开发。新的C#5语言function是编译器的一部分,并将包含在Visual Studio 2012编译器中。 即使您安装了.NET 4.5,也不会让您利用该语言的新function(例如async / await),因为这些需要使用新的编译器。
VS2013
仅与C# 5.0
编译器一起使用,您可以定位各种.NET框架。 因此,您可以使用async / await之类的获取C#5.0function,并仍然以.NET 4.0为目标。