Možnosti kompilátoru jazyka C# pro pravidla jazykových funkcí

Následující možnosti určují, jak kompilátor interpretuje funkce jazyka. Nová syntaxe nástroje MSBuild je zobrazena tučně. Starší syntaxe csc.exe je zobrazena v code stylesouboru .

  • CheckForOverflowUnderflow / -checked: Vygenerujte kontroly přetečení.
  • AllowUnsafeBlocks / -unsafe: Povolte nebezpečný kód.
  • DefineConstants / -define: Definujte symboly podmíněné kompilace.
  • LangVersion / -langversion: Zadejte jazykovou verzi, například default (nejnovější hlavní verzi) nebo latest (nejnovější verzi, včetně podverzí).
  • Nullable / -nullable: Povolte kontext s možnou hodnotou null nebo upozornění s možnou hodnotou null.

CheckForOverflowUnderflow

Možnost CheckForOverflowUnderflow řídí výchozí kontext kontroly přetečení, který definuje chování programu v případě celočíselného aritmetického přetečení.

<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>

Pokud je truecheckForOverflowUnderflow , výchozí kontext je zaškrtnutý kontext a je povolena kontrola přetečení. Jinak je výchozí kontext nezaškrtnutý. Výchozí hodnota této možnosti je , to znamená false, že kontrola přetečení je zakázaná.

Pomocí příkazů a příkazů můžete také explicitně řídit kontext kontroly přetečení částí kódu checked unchecked .

Informace o tom, jak kontext kontroly přetečení ovlivňuje operace a jaké operace jsou ovlivněny, najdete v článku o checked a unchecked příkazech.

AllowUnsafeBlocks

Možnost kompilátoru AllowUnsafeBlocks umožňuje kód, který ke kompilaci používá nebezpečné klíčové slovo. Výchozí hodnota této možnosti je false, což znamená, že nebezpečný kód není povolený.

<AllowUnsafeBlocks>true</AllowUnsafeBlocks>

Další informace o nebezpečném kódu naleznete v tématu Nebezpečný kód a ukazatele.

DefineConstants

Možnost DefineConstants definuje symboly ve všech souborech zdrojového kódu programu.

<DefineConstants>name;name2</DefineConstants>

Tato možnost určuje názvy jednoho nebo více symbolů, které chcete definovat. Možnost DefineConstants má stejný účinek jako #define direktiva preprocesoru s tím rozdílem, že možnost kompilátoru platí pro všechny soubory v projektu. Symbol zůstane definovaný ve zdrojovém souboru, dokud #undef direktiva ve zdrojovém souboru definici neodebere. Pokud použijete -define tuto možnost, direktiva #undef v jednom souboru nemá žádný vliv na jiné soubory zdrojového kódu v projektu. K podmíněné kompilaci zdrojových souborů můžete použít symboly vytvořené touto možností pomocí #if, #else, #elif a #endif . Samotný kompilátor jazyka C# definuje žádné symboly ani makra, které můžete použít ve zdrojovém kódu; všechny definice symbolů musí být definované uživatelem.

Poznámka:

Direktiva jazyka C# #define neumožňuje, aby symbol dostal hodnotu, například v jazycích, jako je C++. Nelze například #define použít k vytvoření makra nebo k definování konstanty. Pokud potřebujete definovat konstantu, použijte proměnnou enum . Pokud chcete vytvořit makro stylu C++, zvažte alternativy, jako jsou obecné typy. Vzhledem k tomu, že makra nejsou náchylná k chybám, C# zakáže jejich použití, ale poskytuje bezpečnější alternativy.

LangVersion

Výchozí jazyková verze kompilátoru jazyka C# závisí na cílovém rozhraní pro vaši aplikaci a na verzi nainstalované sady SDK nebo sady Visual Studio. Tato pravidla jsou definována ve správě verzí jazyka C#.

Upozorňující

LangVersion Nastavení prvku na latest hodnotu se nedoporučuje. Nastavení latest znamená, že nainstalovaný kompilátor používá nejnovější verzi. To se může změnit z počítače na počítač a vytvářet nespolehlivé buildy. Kromě toho umožňuje funkce jazyka, které mohou vyžadovat funkce modulu runtime nebo knihovny, které nejsou součástí aktuální sady SDK.

Možnost LangVersion způsobí, že kompilátor přijme pouze syntaxi, která je součástí zadané specifikace jazyka C#, například:

<LangVersion>9.0</LangVersion>

Platné jsou následující hodnoty:

Hodnota Význam
preview Kompilátor přijímá veškerou platnou syntaxi jazyka z nejnovější verze Preview.
latest Kompilátor přijímá syntaxi z nejnovější vydané verze kompilátoru (včetně podverze).
latestMajor
nebo default
Kompilátor přijímá syntaxi z nejnovější vydané hlavní verze kompilátoru.
13.0 Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 13 nebo nižší.
12.0 Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 12 nebo nižší.
11.0 Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 11 nebo nižší.
10.0 Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 10 nebo nižší.
9.0 Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 9 nebo nižší.
8.0 Kompilátor přijímá pouze syntaxi, která je součástí C# 8.0 nebo nižší.
7.3 Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 7.3 nebo nižší.
7.2 Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 7.2 nebo nižší.
7.1 Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 7.1 nebo nižší.
7 Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 7.0 nebo nižší.
6 Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 6.0 nebo nižší.
5 Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 5.0 nebo nižší.
4 Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 4.0 nebo nižší.
3 Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 3.0 nebo nižší.
ISO-2
nebo 2
Kompilátor přijímá pouze syntaxi, která je součástí ISO/IEC 23270:2006 C# (2.0).
ISO-1
nebo 1
Kompilátor přijímá pouze syntaxi, která je součástí ISO/IEC 23270:2003 C# (1.0/1.2).

Důležité informace

  • Pokud chcete zajistit, aby váš projekt používal výchozí verzi kompilátoru doporučenou pro cílovou architekturu , nepoužívejte možnost LangVersion . Cílovou architekturu můžete aktualizovat pro přístup k novějším jazykových funkcím.

  • Zadání jazyka default LangVersion s hodnotou se liší od vynechání možnosti LangVersion. Určení default používá nejnovější verzi jazyka, který kompilátor podporuje, bez zohlednění cílové architektury. Například sestavení projektu, který cílí na .NET 6 ze sady Visual Studio verze 17.6, používá jazyk C# 10, pokud není zadaný jazyk LangVersion , ale používá jazyk C# 11, pokud je jazyk LangVersion nastavený na default.

  • Metadata odkazovaná vaší aplikací jazyka C# nejsou předmětem možnosti kompilátoru LangVersion .

  • Vzhledem k tomu, že každá verze kompilátoru jazyka C# obsahuje rozšíření specifikace jazyka, LangVersion neposkytuje ekvivalentní funkce starší verze kompilátoru.

  • Aktualizace verzí jazyka C# se obecně shodují s hlavními verzemi .NET, ale nová syntaxe a funkce nemusí být nutně svázané s danou konkrétní verzí architektury. Každá konkrétní funkce má vlastní minimální požadavky rozhraní .NET API nebo běžné jazykové moduly runtime, které můžou umožňovat spouštění na architekturách nižší úrovně včetně balíčků NuGet nebo jiných knihoven.

  • Bez ohledu na to, které nastavení JazykVersion používáte, použijte aktuální verzi modulu CLR (Common Language Runtime) k vytvoření .exe nebo .dll. Jednou výjimkou jsou přátelská sestavení a ModuleAssemblyName, která pracují v části -langversion:ISO-1.

Další způsoby, jak určit jazykovou verzi jazyka C#, najdete v tématu Správa verzí jazyka C#.

Informace o tom, jak tuto možnost kompilátoru nastavit programově, naleznete v tématu LanguageVersion.

specifikace jazyka C#

Verze Odkaz Popis
C# 8.0 a novější stáhnout PDF Specifikace jazyka C# verze 7: .NET Foundation
C# 7.3 stáhnout PDF Standardní ECMA-334 7th Edition
C# 6.0 stáhnout PDF Standardní ECMA-334 6th Edition
C# 5.0 Stáhnout PDF Standardní ECMA-334 5th Edition
C# 3.0 Stáhnout DOKUMENT Specifikace jazyka C# verze 3.0: Microsoft Corporation
C# 2.0 Stáhnout PDF Standard ECMA-334 4th Edition
C# 1.2 Stáhnout DOKUMENT Standardní ECMA-334 2. vydání
C# 1.0 Stáhnout DOKUMENT Standard ECMA-334 1st Edition

Minimální verze sady SDK potřebná k podpoře všech jazykových funkcí

Následující tabulka uvádí minimální verze sady SDK s kompilátorem jazyka C#, který podporuje odpovídající jazykovou verzi:

Verze jazyka C# Minimální verze sady SDK
C# 12 Microsoft Visual Studio/Build Tools 2022 verze 17.8 nebo .NET 8 SDK
C# 11 Microsoft Visual Studio/Build Tools 2022 verze 17.4 nebo .NET 7 SDK
C# 10 Microsoft Visual Studio/Build Tools 2022 nebo .NET 6 SDK
C# 9.0 Microsoft Visual Studio/Build Tools 2019 verze 16.8 nebo .NET 5 SDK
C# 8.0 Microsoft Visual Studio/Build Tools 2019, verze 16.3 nebo .NET Core 3.0 SDK
C# 7.3 Microsoft Visual Studio/Build Tools 2017 verze 15.7
C# 7.2 Microsoft Visual Studio/Build Tools 2017 verze 15.5
C# 7.1 Microsoft Visual Studio/Build Tools 2017 verze 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 nebo sada kompilátoru rozhraní .NET Framework 4.5
C# 4 Microsoft Visual Studio/Build Tools 2010 nebo sada kompilátoru .NET Framework 4.0
C# 3 Microsoft Visual Studio/Build Tools 2008 nebo sada kompilátoru rozhraní .NET Framework 3.5
C# 2 Microsoft Visual Studio/Build Tools 2005 nebo sada kompilátoru .NET Framework 2.0
C# 1.0/1.2 Microsoft Visual Studio/Build Tools .NET 2002 nebo sada kompilátoru .NET Framework 1.0

Vynulovatelné

Možnost Nullable umožňuje zadat kontext s možnou hodnotou null. Dá se nastavit v konfiguraci projektu pomocí značky <Nullable> :

<Nullable>enable</Nullable>

Argument musí být jeden z enable, disable, warningsnebo annotations. Argument enable povolí kontext s možnou hodnotou null. Zadání disable zakáže kontext s možnou hodnotou null. Když zadáte warnings argument, povolí se kontext upozornění s možnou hodnotou null. Když zadáte annotations argument, povolí se kontext poznámek s možnou hodnotou null. Hodnoty jsou popsány a vysvětleny v článku o kontextech s možnou hodnotou Null. Další informace o úlohách, které se týkají povolení referenčních typů s možnou hodnotou null ve stávajícím základu kódu, najdete v našem článku o strategiích migrace s možnou hodnotou null.

Poznámka:

Pokud neexistuje žádná sada hodnot, použije se výchozí hodnotadisable, ale šablony .NET 6 jsou ve výchozím nastavení k dispozici s hodnotou Nullable nastavenou na enablehodnotu .

Analýza toku se používá k odvození hodnoty null proměnných v rámci spustitelného kódu. Odvozená nullability proměnné je nezávislá na deklarované nullability proměnné. Volání metod se analyzují i v případě, že jsou podmíněně vynechána. Například Debug.Assert v režimu vydání.

Vyvolání metod anotovaných s následujícími atributy ovlivní také analýzu toku:

Důležité

Globální kontext s možnou hodnotou null se nevztahuje na vygenerované soubory kódu. Bez ohledu na toto nastavení je kontext s možnou hodnotou null zakázán pro jakýkoli zdrojový soubor označený jako vygenerovaný. Soubor je označený jako vygenerovaný čtyřmi způsoby:

  1. V souboru .editorconfig zadejte generated_code = true v oddílu, který se vztahuje na tento soubor.
  2. Umístěte <auto-generated> komentář do horní části souboru nebo <auto-generated/> do komentáře. Může být na libovolném řádku v daném komentáři, ale blok komentáře musí být prvním prvkem v souboru.
  3. Spusťte název souboru pomocí TemporaryGeneratedFile_
  4. Ukončete název souboru .designer.cs, .generated.cs, .g.cs nebo .g.i.cs.

Generátory se můžou přihlásit pomocí direktivy preprocesoru #nullable .