2015-04-06 11 views
26

Angenommen, ich möchte jemanden über die Unterschiede zwischen foreach in C# 4.0 und 5.0 demonstrieren.So kompilieren Sie C# mit bestimmter Sprachversion

So schreibe ich mein Code-Schnipsel up:

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

Aber egal, wie ich es kompilieren, es funktioniert immer, wie es in 5,0 * tut. Ich habe versucht, die Sprachversion in der csproj Datei einstellen (Build -> Erweitert -> Sprachversion) und ich habe versucht, Gebäude es nur auf der Kommandozeile:

csc myProgram.cs /langversion:4 

ich nicht bekommen kann es zu arbeiten der "alte" Weg. Irgendeine Hilfe? Bonuspunkte, wenn Sie mir sagen können, wie es in der Befehlszeile und in Visual Studio funktioniert.

* Für alle, die nicht wissen, in C#. < = 4.0 würde dies Cantelope Cantelope Cantelope drucken, während in C# 5.0 + es (intuitiver) Apple Banana Cantelope drucken würde. Here's a link und here's another.

+0

, wie wissen Sie, es ist nicht die alte Art und Weise der Zusammenstellung – pm100

+1

Es könnte Leser helfen zu zeigen, was in den beiden Versionen unterschiedlich sein sollte. Nicht viele Leute sind sich der Veränderung bewusst, wie die Schleifenvariable in Schließungen behandelt wird. –

+0

C# 4 hatte Aktionen und Lambda-Ausdrücke. Was denkst du sollte es tun, dass es nicht ist? –

Antwort

28

Der Zweck der /langversion ist nur, den Compiler spezifische Sprachkonstrukte akzeptieren zu lassen. Es hat keinen Einfluss auf das tatsächliche Verhalten des Compilers.

Die documentation lautet:

den Compiler verursacht nur Syntax zu akzeptieren, die in der gewählten Sprache C# Spezifikation enthalten ist.

und

Da jede Version des C# Compiler enthält Erweiterungen der Sprachspezifikation,/langversion nicht geben Ihnen die entsprechende Funktionalität von einer früheren Version des Compilers.

Um das unterschiedliche Verhalten zu demonstrieren, müssen Sie eine andere csc.exe verwenden, die mit den richtigen Framework-Versionen installiert wurde.

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