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 style
souboru .
- 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říkladdefault
(nejnovější hlavní verzi) nebolatest
(nejnovější verzi, včetně podverzí). - Nullable /
-nullable
: Povolte kontext s možnou hodnotou null nebo upozornění s možnou hodnotou null.
Poznámka:
Další informace o konfiguraci těchto možností pro váš projekt najdete v možnostech kompilátoru.
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 true
checkForOverflowUnderflow , 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ý nadefault
.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
, warnings
nebo 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 enable
hodnotu .
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:
- Jednoduché předběžné podmínky: AllowNullAttribute a DisallowNullAttribute
- Jednoduché po podmínkách: MaybeNullAttribute a NotNullAttribute
- Podmíněné po podmínkách: MaybeNullWhenAttribute a NotNullWhenAttribute
- DoesNotReturnIfAttribute (například
DoesNotReturnIf(false)
pro Debug.Assert) a DoesNotReturnAttribute - NotNullIfNotNullAttribute
- Členské podmínky po splnění podmínek: MemberNotNullAttribute(String)MemberNotNullAttribute(String[])
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:
- V souboru .editorconfig zadejte
generated_code = true
v oddílu, který se vztahuje na tento soubor. - 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. - Spusťte název souboru pomocí TemporaryGeneratedFile_
- 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
.