C#-Compileroptionen für Sprachfunktionsregeln

Mit den folgenden Optionen wird gesteuert, wie der Compiler Sprachfunktionen interpretiert. Die neue MSBuild-Syntax wird fett formatiert dargestellt. Die ältere csc.exe-Syntax wird in code style dargestellt.

  • CheckForOverflowUnderflow / -checked: Generiert Überlaufüberprüfungen.
  • AllowUnsafeBlocks / -unsafe: Lässt „unsicheren“ Code zu.
  • DefineConstants / -define: Definiert Symbole für bedingte Kompilierung.
  • LangVersion / -langversion: Gibt die Sprachversion an, z. B. default (letzte Hauptversion) oder latest (neueste Version, einschließlich Nebenversionen).
  • Nullable / -nullable: Lässt Kontext mit Nullwerten oder Warnungen mit Nullwerten zu.

CheckForOverflowUnderflow

Die Option CheckForOverflowUnderflow gibt an, ob eine Anweisung der Ganzzahlarithmetik, die einen Wert außerhalb des Bereichs des Datentyps nach sich zieht, eine Laufzeitausnahme verursacht.

<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>

Eine Anweisung der Ganzzahlarithmetik, die im Rahmen eines checked- oder unchecked-Schlüsselworts liegt, ist nicht der Auswirkung der Option CheckForOverflowUnderflow unterworfen. Wenn eine Anweisung der Ganzzahlarithmetik, die sich nicht im Rahmen eines checked- oder unchecked-Schlüsselworts befindet, einen Wert außerhalb des Bereichs des Datentyps ergibt, und CheckForOverflowUnderflow den Wert true aufweist, löst die Anweisung zur Laufzeit eine Ausnahme aus. Wenn CheckForOverflowUnderflow den Wert false aufweist, löst die Anweisung zur Laufzeit keine Ausnahme aus. Der Standardwert für diese Option lautet false; die Überlaufüberprüfung ist deaktiviert.

AllowUnsafeBlocks

Die Compileroption AllowUnsafeBlocks ermöglicht das Kompilieren von Code, der das Schlüsselwort unsafe verwendet. Der Standardwert für diese Option ist false, was bedeutet, dass unsicherer Code unzulässig ist.

<AllowUnsafeBlocks>true</AllowUnsafeBlocks>

Weitere Informationen zu unsicherem Code finden Sie unter Unsicherer Code und Zeiger.

DefineConstants

Die Option DefineConstants definiert Symbole in allen Quellcodedateien Ihres Programms.

<DefineConstants>name;name2</DefineConstants>

Diese Option gibt die Namen eines oder mehrerer Symbole an, die Sie definieren möchten. Die Option DefineConstants hat dieselbe Auswirkung wie die Verwendung einer #define-Präprozessoranweisung, außer dass die Compileroption für alle Dateien im Projekt gültig ist. Ein Symbol bleibt in einer Quelldatei definiert, bis eine #undef-Anweisung in der Quelldatei die Definition entfernt. Wenn Sie die Option -define verwenden, hat eine #undef-Anweisung in einer Datei keinerlei Auswirkung auf andere Quellcodedateien im Projekt. Sie können die durch diese Option erstellten Symbole in Verbindung mit #if, #else, #elif, und #endif verwenden, um Quelldateien bedingt zu kompilieren. Der C#-Compiler selbst definiert keine Symbole oder Makros, die Sie in Ihrem Quellcode verwenden können. Alle Symboldefinitionen müssen benutzerdefiniert sein.

Hinweis

Die C#-Direktive #define erlaubt es nicht, einem Symbol wie in Sprachen wie C++ einen Wert zuzuweisen. Beispielsweise kann #define nicht zum Erstellen eines Makros oder zum Definieren einer Konstante verwendet werden. Falls Sie eine Konstante definieren müssen, verwenden Sie eine enum-Variable. Wenn Sie ein C++-übliches Makro erstellen möchten, erwägen Sie Alternativen wie Generics. Da Makros sehr fehleranfällig sind, ist ihre Verwendung in C# nicht zugelassen. Es stehen jedoch sicherere Alternativen zur Verfügung.

LangVersion

Führt dazu, dass der Compiler nur Syntax akzeptiert, die in der ausgewählten C#-Sprachspezifikation enthalten ist.

<LangVersion>9.0</LangVersion>

Folgende Werte sind gültig:

Wert Bedeutung
preview Der Compiler akzeptiert jede gültige Sprachsyntax der letzten Vorschauversion.
latest Der Compiler akzeptiert die Syntax der neuesten veröffentlichte Version des Compilers (einschließlich Nebenversionen).
latestMajor (default) Der Compiler akzeptiert die Syntax der neuesten veröffentlichte Hauptversion des Compilers.
10.0 Der Compiler akzeptiert nur Syntax, die in C# 10 oder niedriger enthalten ist.
9.0 Der Compiler akzeptiert nur Syntax, die in C# 9 oder niedriger enthalten ist.
8.0 Der Compiler akzeptiert nur Syntax, die in C# 8.0 oder niedriger enthalten ist.
7.3 Der Compiler akzeptiert nur Syntax, die in C# 7.3 oder früher enthalten ist.
7.2 Der Compiler akzeptiert nur Syntax, die in C# 7.2 oder früher enthalten ist.
7.1 Der Compiler akzeptiert nur Syntax, die in C# 7.1 oder früher enthalten ist.
7 Der Compiler akzeptiert nur Syntax, die in C# 7.0 oder früher enthalten ist.
6 Der Compiler akzeptiert nur Syntax, die in C# 6.0 oder früher enthalten ist.
5 Der Compiler akzeptiert nur Syntax, die in C# 5.0 oder früher enthalten ist.
4 Der Compiler akzeptiert nur Syntax, die in C# 4.0 oder früher enthalten ist.
3 Der Compiler akzeptiert nur Syntax, die in C# 3.0 oder früher enthalten ist.
ISO-2 (oder 2) Der Compiler akzeptiert nur Syntax, die in ISO/IEC 23270:2006 C# (2.0) enthalten ist.
ISO-1 (oder 1) Der Compiler akzeptiert nur Syntax, die in ISO/IEC 23270:2003 C# (1.0/1.2) enthalten ist.

Die Standardsprachversion ist vom Zielframework für Ihre Anwendung und der installierten Version des SDK oder von Visual Studio abhängig. Diese Regeln werden in der C#-Sprachversionsverwaltung definiert.

Metadaten, auf die von Ihrer C#-Anwendung verwiesen wird, unterliegen nicht der Compileroption LangVersion.

Da jede Version des C#-Compilers Erweiterungen der Sprachspezifikation enthält, bietet LangVersion Ihnen nicht die gleiche Funktionalität wie die einer früheren Compilerversion.

Während C#-Versionsupdates im Allgemeinen mit haupt .NET-Versionen übereinstimmen, sind die neuen Syntax und Features nicht unbedingt an diese bestimmte Frameworkversion gebunden. Während die neuen Features ein Compilerupdate erfordern, das mit der C#-Revision veröffentlicht wird, hat jedes Feature seine eigene mindestens erforderliche .NET-API- oder CLR-Anforderungen, durch die es auf abwärtskompatiblen Frameworks ausgeführt werden kann, indem NuGet-Pakete oder andere Bibliotheken einbezogen werden.

Unabhängig von der verwendeten LangVersion-Einstellung verwenden Sie die aktuelle Version der CLR, um Ihre EXE- oder DLL-Dateien zu erstellen. Davon ausgenommen sind Friend-Assemblys und ModuleAssemblyName, die unter -langversion:ISO-1 ausgeführt werden.

Weitere Möglichkeiten zum Angeben der C#-Sprachversion finden Sie unter C#-Sprachversionsverwaltung.

Informationen zum programmgesteuerten Festlegen dieser Compileroption finden Sie unter LanguageVersion.

C#-Sprachspezifikation

Version Link Beschreibung
C# 7.0 und höher Derzeit nicht verfügbar
C# 6.0 Link C#-Spezifikation Version 6, inoffizieller Entwurf: .NET Foundation
C# 5.0 PDF herunterladen Standard ECMA-334, 5. Edition
C# 3.0 DOC herunterladen C#-Programmiersprachenspezifikation Version 3.0: Microsoft Corporation
C# 2.0 PDF herunterladen Standard ECMA-334, 4. Edition
C# 1.2 DOC herunterladen C#-Programmiersprachenspezifikation Version 1.2: Microsoft Corporation
C# 1.0 DOC herunterladen C#-Programmiersprachenspezifikation Version 1.0: Microsoft Corporation

Mindestens erforderliche SDK-Version, die erforderlich ist, um alle Sprachfeatures zu unterstützen

In der folgenden Tabelle sind die Mindestversionen des SDK mit dem C#-Compiler aufgeführt, der die entsprechende Sprachversion unterstützt:

C#-Version Mindestversion des SDK
C# 10 Microsoft Visual Studio/Build Tools 2022 oder .NET SDK 6
C# 9.0 Microsoft Visual Studio/Build Tools 2019, Version 16.8 oder .NET SDK 5
C# 8.0 Microsoft Visual Studio/Build Tools 2019, Version 16.3, oder .NET Core 3.0 SDK
C# 7.3 Microsoft Visual Studio/Build Tools 2017, Version 15.7
C# 7.2 Microsoft Visual Studio/Build Tools 2017, Version 15.5
C# 7.1 Microsoft Visual Studio/Build Tools 2017, Version 15.3
C# 7.0 Microsoft Visual Studio/Build Tools 2017
C# 6 Microsoft Visual Studio/Build Tools 2015
C# 5 Microsoft Visual Studio/Build Tools 2012 oder gebündelter .NET Framework 4.5-Compiler
C# 4 Microsoft Visual Studio/Build Tools 2010 oder gebündelter .NET Framework 4.0-Compiler
C# 3 Microsoft Visual Studio/Build Tools 2008 oder gebündelter .NET Framework 3.5-Compiler
C# 2 Microsoft Visual Studio/Build Tools 2005 oder gebündelter .NET Framework 2.0-Compiler
C# 1.0/1.2 Microsoft Visual Studio/Build Tools .NET 2002 oder gebündelter .NET Framework 1.0-Compiler

Nullwerte zulässig

Mit der Option Nullable können Sie den Kontext festlegen, der Nullwerte zulässt. Sie kann mithilfe des Tags in der Konfiguration <Nullable> des Projekts festgelegt werden:

<Nullable>enable</Nullable>

Eines der folgenden Argumente muss verwendet werden: enable, disable, warnings oder annotations. Das Argument enable aktiviert den Nullwerte zulassenden Kontext. Durch Angeben von disable wird der Nullwerte zulassende Kontext deaktiviert. Wenn das warnings-Argument angegeben wird,wird der Nullwerte zulassende Warnungskontext aktiviert. Wenn das annotations-Argument angegeben wird,wird der Nullwerte zulassende Anmerkungskontext aktiviert.

Hinweis

Wenn kein Wertsatz vorhanden ist, wird der Standardwert disable angewendet, die .NET 6-Vorlagen werden jedoch standardmäßig mit dem nullablen Wert angegeben, der auf enable.NET 6 festgelegt ist.

Die Ablaufsteuerungsanalyse wird dazu verwendet, die NULL-Zulässigkeit von Variablen in ausführbarem Code abzuleiten. Die abgeleitete NULL-Zulässigkeit einer Variable ist unabhängig von der deklarierten NULL-Zulässigkeit der Variable. Methodenaufrufe werden auch analysiert, wenn sie bedingt ausgelassen werden. Dies gilt beispielsweise für die Methode Debug.Assert im Releasemodus.

Das Aufrufen von Methoden, die mit den folgenden Attributen versehen sind, wirken sich auf die Ablaufsteuerungsanalyse aus:

Wichtig

Der globale Nullable-Kontext gilt nicht für generierte Codedateien. Der Nullable-Kontext ist unabhängig von dieser Einstellung für alle als generiert gekennzeichneten Quelldateien deaktiviert. Es gibt viel Möglichkeiten, eine Datei als generiert zu markieren:

  1. Geben Sie in der EDITORCONFIG-Datei generated_code = true in einem Abschnitt an, der für diese Datei gilt.
  2. Fügen Sie <auto-generated> oder <auto-generated/> ganz oben in der Datei in einem Kommentar ein. Dabei kann es sich um eine beliebige Zeile des Kommentars handeln, jedoch muss es sich beim Kommentarblock um das erste Element in der Datei handeln.
  3. Beginnen Sie den Dateinamen mit TemporaryGeneratedFile_ .
  4. Enden Sie den Dateinamen mit .designer.cs, .generated.cs, .g.cs oder .g.i.cs.

Generatoren können die Präprozessoranweisung #nullable verwenden.