2015-04-06 72 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 
相關問題