2015-04-06 9 views
26

Diciamo che voglio fare una dimostrazione a qualcuno delle differenze tra foreach in C# 4.0 e 5.0.Come compilare C# con lingua specifica Versione

Così scrivo il mio frammento di codice:

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(); 
    } 
} 

Ma non importa quanto compilo, funziona sempre come avviene in 5,0 *. Ho provato a installare la versione in lingua nel file csproj (Build -> Avanzate -> Versione linguaggio) e ho provato solo la costruzione sulla riga di comando:

csc myProgram.cs /langversion:4 

non riesco a farlo funzionare il "vecchio" modo. Qualsiasi aiuto? Punti bonus se puoi dirmi come farlo su entrambi i comandi e Visual Studio.

* Per chi non lo sapesse, in C#. < = 4.0 questo dovrebbe stampare Cantelope Cantelope Cantelope, mentre in C# 5.0+ sarebbe (più intuitivamente) stampare Apple Banana Cantelope. Here's a link e here's another.

+0

come fai a sapere la sua non è la compilazione del vecchio modo – pm100

+1

Potrebbe aiutare i lettori a sottolineare quello che dovrebbe essere diverso nelle due versioni. Non molte persone sono consapevoli del cambiamento nel modo in cui la variabile del ciclo viene trattata nelle chiusure. –

+0

C# 4 aveva azioni e espressioni Lambda. Cosa pensi che dovrebbe fare che non lo sia? –

risposta

28

Lo scopo di /langversion è solo quello di consentire al compilatore di accettare costrutti di linguaggio specifici. Non influisce sul comportamento effettivo del compilatore.

Le documentation afferma che:

fa sì che il compilatore di accettare solo la sintassi che è incluso nella specifica C# lingua scelta.

e

Poiché ogni versione del compilatore C# contiene estensioni per le specifiche del linguaggio,/langversion non ti dà la funzionalità equivalente di una versione precedente del compilatore.

Quindi, per dimostrare il diverso comportamento, sarà necessario utilizzare un diverso csc.exe, installato con le giuste versioni di framework.

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