Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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: Allowunsafecode. -
DefineConstants /
-define: Definieren von Symbolen für die bedingte Kompilierung. -
LangVersion /
-langversion: Gibt die Sprachversion an, z. B.default(letzte Hauptversion) oderlatest(neueste Version, einschließlich Nebenversionen). -
Nullable /
-nullable: Lässt Kontext mit Nullwerten oder Warnungen mit Nullwerten zu.
Hinweis
Weitere Informationen zum Konfigurieren dieser Optionen für Ihr Projekt finden Sie unter Compileroptionen.
CheckForOverflowUnderflow
Die Option CheckForOverflowUnderflow steuert den standardmäßigen Überlaufüberprüfungskontext, der das Programmverhalten definiert, wenn ganzzahlige arithmetische Überläufe auftreten.
<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
Wenn CheckForOverflowUnderflow ist, ist trueder Standardkontext ein aktivierter Kontext und die Überlaufüberprüfung ist aktiviert. Wenn CheckForOverflowUnderflow ist, ist falseder Standardkontext ein deaktivierter Kontext. Der Standardwert für diese Option lautet false, was bedeutet, dass die Überlaufüberprüfung deaktiviert ist.
Sie können den Überlaufüberprüfungskontext auch explizit für Teile Ihres Codes steuern, indem Sie die checked Anweisungen verwenden unchecked .
Informationen dazu, wie sich der Überlaufüberprüfungskontext auf Vorgänge auswirkt und welche Vorgänge betroffen sind, finden Sie im Artikel zu checked und unchecked anweisungen.
AllowUnsafeBlocks
Die Compileroption AllowUnsafeBlocks ermöglicht das Kompilieren von Code, der das Schlüsselwort unsafe verwendet. Der Standardwert für diese Option ist false, d. h. unsicherer Code ist unzulässig.
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
Weitere Informationen zu unsicherem Code finden Sie unter Unsicherer Code und Zeiger.
Aktivieren der aktualisierten Speichersicherheitsregeln
Die aktualisierten Speichersicherheitsregeln sind ein Vorschaufeature in C# 15 und .NET 11. Sie verwenden zwei unabhängige Compilereinstellungen:
- Die
previewSprachversion ermöglicht die neue Syntax und Zeigerentspannungen. - Das
updated-memory-safety-rulesCompilerfeature ermöglicht die aktualisierten Regeln, einschließlich nicht unsicherer Aufruferverpflichtungen, und bewirkt, dass der Compiler die Auswahl in der Assembly mit dem MemorySafetyRulesAttribute Attribut aufzeichnen kann.
Eine zukünftige stabile SDK-Eigenschaft ist als dritte Aktivierungsstufe geplant, MemorySafetyRuleswenn das Feature die Vorschau beendet (z. B <MemorySafetyRules>2</MemorySafetyRules>. ), aber diese Eigenschaft noch nicht implementiert ist.
Verwenden Sie für ein Projekt beide Einstellungen:
<PropertyGroup>
<LangVersion>preview</LangVersion>
<Features>$(Features);updated-memory-safety-rules</Features>
</PropertyGroup>
Fügen Sie für ein dateibasiertes Programm die entsprechenden Direktiven hinzu:
#:property Features=$(Features);updated-memory-safety-rules
#:property LangVersion=preview
Die AllowUnsafeBlocks-Eigenschaft ist unabhängig. Sie steuert, ob die Quelle das unsafe Schlüsselwort verwenden kann. Ein Projekt kann die aktualisierten Regeln aktivieren, ohne unsicheren Code zuzulassen, in diesem Fall empfängt es Fehler, wenn es aufruft, unsichere APIs.
Gibt an, ob eine Assembly die aktualisierten Regeln gegen eine andere erzwingt, hängt davon ab, welche Seite sich für Folgendes entscheidet:
-
Aufrufer des aktualisierten Modells, Angerufener mit aktualisiertem Modell: Die Marker des
unsafeAngerufenen durchlaufen Metadaten. Der Aufrufer umschließt jeden Aufruf an ein erfordertes unsicheres Element in einemunsafeBlock. -
Aufrufer des Originalmodells, angerufener Originalmodell:Ein Kompatibilitätsmodus behandelt alle Angerufenen mit einem Zeigertyp in seiner Signatur als erforderlich unsicher, sodass die Anrufwebsite einen eingeschlossenen
unsafeBlock benötigt. Dieser Modus verhindert, dass eine zeigerbasierte API ihreunsafeAnforderung im Hintergrund verliert. - Originalmodellanrufer, Angerufener mit aktualisiertem Modell: Die ursprünglichen Zeigerregeln gelten weiterhin. Ein unsicheres Element ohne Zeigertyp in seiner Signatur wird aus sicherem Code aufgerufen, da der ursprüngliche Modellaufrufer die neuen Markierungen nicht lesen kann.
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# #define -Direktive lässt nicht zu, dass ein Symbol einen Wert aufweist, z. B. in Sprachen wie C++. Beispielsweise #define kann kein Makro erstellt oder eine Konstante definiert werden. Falls Sie eine Konstante definieren müssen, verwenden Sie eine enum-Variable. Wenn Sie ein C++-Makro erstellen möchten, sollten Sie Alternativen wie Generika in Betracht ziehen. Da Makros sehr fehleranfällig sind, ist ihre Verwendung in C# nicht zugelassen. Es stehen jedoch sicherere Alternativen zur Verfügung.
LangVersion
Die Standardsprachversion für den C#-Compiler ist vom Zielframework für Ihre Anwendung und der installierten SDK- oder Visual Studio-Version abhängig. Diese Regeln werden in der C#-Sprachversionsverwaltung definiert.
Warnung
Legen Sie das LangVersion Element nicht auf latest. Die Einstellung latest bedeutet, dass der installierte Compiler seine neueste Version verwendet. Diese Version kann von Computer zu Computer geändert werden, sodass Builds unzuverlässig sind. Darüber hinaus ermöglicht es Sprachfeatures, die möglicherweise Laufzeit- oder Bibliotheksfeatures erfordern, die nicht im aktuellen SDK enthalten sind.
Die LangVersion-Option bewirkt, dass der Compiler nur syntax akzeptiert, die in der angegebenen C#-Sprachspezifikation enthalten ist, z. B.:
<LangVersion>9.0</LangVersion>
Einige Vorschaufeatures erfordern zusätzlich zu <LangVersion>preview</LangVersion>. Beispielsweise verwenden die aktualisierten C# 15 Speichersicherheitsregeln das updated-memory-safety-rules Compilerfeature. Weitere Informationen finden Sie unter Aktivieren der aktualisierten Speichersicherheitsregeln.
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). |
latestMajoroder default |
Der Compiler akzeptiert die Syntax der neuesten veröffentlichte Hauptversion des Compilers. |
15.0 |
Der Compiler akzeptiert nur syntax, die in C# 15 oder niedriger enthalten ist. |
14.0 |
Der Compiler akzeptiert nur syntax, die in C# 14 oder niedriger enthalten ist. |
13.0 |
Der Compiler akzeptiert nur Syntax von C# 13 oder niedriger. |
12.0 |
Der Compiler akzeptiert nur Syntax von C# 12 oder niedriger. |
11.0 |
Der Compiler akzeptiert nur Syntax von C# 11 oder niedriger. |
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-2oder 2 |
Der Compiler akzeptiert nur Syntax, die in ISO/IEC 23270:2006 C# (2.0) enthalten ist. |
ISO-1oder 1 |
Der Compiler akzeptiert nur Syntax, die in ISO/IEC 23270:2003 C# (1.0/1.2) enthalten ist. |
Überlegungen
Um sicherzustellen, dass Ihr Projekt die für Ihr Zielframework empfohlene Standardcompilerversion verwendet, verwenden Sie nicht die Option LangVersion. Aktualisieren Sie das Zielframework, um auf neuere Sprachfeatures zuzugreifen.
Die Angabe von LangVersion mit dem Wert
defaultentspricht nicht dem Weglassen der Option LangVersion. Bei der Angabe vondefaultwird die neueste Version der Sprache verwendet, die der Compiler unterstützt, ohne das Zielframework zu berücksichtigen. Beispielsweise wird beim Erstellen eines Projekts für .NET 6 über Visual Studio-Version 17.6 C# 10 verwendet, wenn LangVersion nicht angegeben ist. Wenn LangVersion aufdefaultfestgelegt ist, wird hingegen C# 11 verwendet.Die Compileroption LangVersion wirkt sich nicht auf Metadaten aus, auf die von Ihrer C#-Anwendung verwiesen wird.
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.
Die neue Syntax und die neuen Features sind nicht unbedingt an die spezifische Framework-Version gebunden, während C#-Versionsupdates für gewöhnlich mit den .NET-Hauptversionen übereinstimmen. Jedes bestimmte Feature verfügt über eine eigene mindeste .NET API oder allgemeine Sprachlaufzeitanforderungen, mit denen es unter Umständen auf Frameworks auf Down-Level-Frameworks ausgeführt werden kann, indem NuGet-Pakete oder andere Bibliotheken eingeschlossen 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# 8.0 und höher | PDF herunterladen | C#-Sprachspezifikation Version 7: .NET Foundation |
| C# 7.3 | PDF herunterladen | Standard ECMA-334, 7. Edition |
| C# 6.0 | PDF herunterladen | Standard ECMA-334, 6. Edition |
| 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 | Standard ECMA-334, 2. Edition |
| C# 1.0 | DOC herunterladen | Standard ECMA-334, 1. Edition |
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# 12 | Microsoft Visual Studio/Build Tools 2022, Version 17.8 oder .NET 8 SDK |
| C# 11 | Microsoft Visual Studio/Build Tools 2022, Version 17.4 oder .NET 7 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 5 SDK |
| 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/Buildtools 2017 |
| C# 6 | Microsoft Visual Studio/Buildtools 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
Verwenden Sie die Nullable-Option , um den nullfähigen Kontext anzugeben. Legen Sie sie in der Konfiguration des Projekts mithilfe des <Nullable> Tags fest:
<Nullable>enable</Nullable>
Eines der folgenden Argumente muss verwendet werden: enable, disable, warnings oder annotations. Das enable Argument aktiviert den nullfähigen Kontext. Das disable Argument deaktiviert den nullfähigen Kontext. Das warnings Argument aktiviert den Kontext der NULL-Warnung. Das annotations Argument aktiviert den Kontext mit nullablen Anmerkungen. Weitere Informationen zu diesen Werten finden Sie unter Nullwerte.For more information about these values, see Nullable contexts. Weitere Informationen zum Aktivieren nullfähiger Verweistypen in einer vorhandenen Codebasis finden Sie unter Null-Migrationsstrategien.
Hinweis
Wenn Sie keinen Wert festlegen, lautet disableder Standardwert . .NET 6- und neueren Vorlagen legen jedoch standardmäßig den Nullwerte festenable.
Die Flussanalyse leitet die Nullierbarkeit von Variablen innerhalb von ausführbarem Code ab. Die abgeleitete NULL-Zulässigkeit einer Variable ist unabhängig von der deklarierten NULL-Zulässigkeit der Variable. Der Compiler analysiert Methodenaufrufe, auch wenn der Aufruf bedingt aus der kompilierten Ausgabe weggelassen wird. Beispielsweise analysiert der Compiler weiterhin einen Aufruf zur Debug.Assert Nullierbarkeit, obwohl der Aufruf bedingt ist und nicht in Releasebuilds kompiliert wird.
Der Aufruf von Methoden, die mit den folgenden Attributen versehen sind, wirkt sich auch auf die Flussanalyse aus:
- Einfache Voraussetzungen: AllowNullAttribute und DisallowNullAttribute
- Einfache Postconditionen: MaybeNullAttribute und NotNullAttribute
- Bedingte Postconditionen: MaybeNullWhenAttribute und NotNullWhenAttribute
-
DoesNotReturnIfAttribute (z. B.
DoesNotReturnIf(false)für Debug.Assert) und DoesNotReturnAttribute - NotNullIfNotNullAttribute
- Mitglied postconditions: MemberNotNullAttribute(String) und MemberNotNullAttribute(String[])
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. Eine Datei wird auf eine der folgenden Arten als generiert markiert:
- Geben Sie in der EDITORCONFIG-Datei
generated_code = truein einem Abschnitt an, der für diese Datei gilt. - Fügen Sie
<auto-generated>oben in der Datei einen Kommentar ein oder<auto-generated/>in einen Kommentar ein. Sie können sie in einer beliebigen Zeile im Kommentar platzieren, aber der Kommentarblock muss das erste Element in der Datei sein. - Beginnen Sie den Dateinamen mit TemporaryGeneratedFile_ .
- Enden Sie den Dateinamen mit .designer.cs, .generated.cs, .g.cs oder .g.i.cs.
Generatoren können sich mit der #nullable Präprozessordirektive anmelden.