2015-04-06 62 views
26

假设我想向某人展示C#4.0和5.0中foreach之间的区别。如何使用特定语言版本编译C#

所以我写了我的代码片段:

public static void Main() 
{ 
    string[] fruits = { "Apple", "Banana", "Cantelope" }; 
    var actions = new List<Action>(); 
    foreach (var fruit in fruits) 
    { 
     actions.Add(() => Console.WriteLine(fruit)); 
    } 

    foreach(var a in actions) 
    { 
     a(); 
    } 
} 

但无论我怎么编译它,它总是工作,它在5.0 *一样。我试着在的csproj文件中设置语言版本(建设 - >高级 - >语言版本),我已经试过只是建立在命令行上:

csc myProgram.cs /langversion:4 

我不能让它开始工作“老”的方式。任何帮助?如果您可以告诉我如何在命令行和Visual Studio中执行此操作,则可获得奖励积分。

*对于任何不知道的人,在C#中。 < = 4.0这将打印Cantelope Cantelope Cantelope,而在C#5.0 +它会(更直观地)打印Apple Banana CantelopeHere's a linkhere's another

+0

你怎么知道它没有编译旧的方式 – pm100

+1

它可能会帮助读者指出两个版本应该有什么不同。并不是很多人意识到循环变量在闭包中的变化。 –

+0

C#4有动作和Lambda表达式。你认为它应该做什么,它不是? –

回答

28

/langversion的目的只是为了让编译器接受特定的语言结构。它不影响编译器的实际行为。

documentation指出:

使编译器只接受被包含在所选择的C#语言规范的语法。

因为C#编译器的各个版本包含扩展的语言规范,/ langversion不给你的编译器的早期版本的等效功能。

因此,为了演示不同的行为,您将不得不使用与正确的框架版本一起安装的不同的csc.exe。

C:\Windows\Microsoft.NET\Framework\v3.5>csc /out:c:\temp\foo-35.exe c:\temp\foo.cs 
Microsoft (R) Visual C# 2008 Compiler version 3.5.30729.7903 
for Microsoft (R) .NET Framework version 3.5 
Copyright (C) Microsoft Corporation. All rights reserved. 


C:\Windows\Microsoft.NET\Framework\v3.5>c:\temp\foo-35.exe 
Cantelope 
Cantelope 
Cantelope