Možnosti kompilátoru C# pro pravidla jazykových funkcí
Následující možnosti určují, jak kompilátor interpretuje jazykové funkce. nová syntaxe MSBuild je zobrazena tučně. Starší syntaxe csc.exe se zobrazuje v code style .
- CheckForOverflowUnderflow /
-checked: generování kontrol přetečení. - AllowUnsafeBlocks /
-unsafe: povolí nezabezpečený kód. - DefineConstants /
-define: Definujte symboly podmíněné kompilace. - Langversion – /
-langversion: zadejte jazykovou verzidefault, například (nejnovější hlavní verzi) nebolatest(nejnovější verzi, včetně dílčích verzí). - Nullable /
-nullable: Povolit kontext s možnou hodnotou null nebo upozornění s možnou hodnotou null.
CheckForOverflowUnderflow
Možnost CheckForOverflowUnderflow určuje, zda je celočíselný aritmetický příkaz, jehož výsledkem je hodnota, která je mimo rozsah datového typu, způsobuje výjimku za běhu.
<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
Celočíselný aritmetický příkaz, který je v oboru checked unchecked klíčového slova nebo, nepodléhá efektu možnosti CheckForOverflowUnderflow . Pokud celočíselný aritmetický příkaz, který není v oboru checked unchecked klíčového slova nebo, má za následek hodnotu mimo rozsah datového typu a CheckForOverflowUnderflow je true , tento příkaz způsobí výjimku v době běhu. Pokud je CheckForOverflowUnderflow false , tento příkaz během běhu nezpůsobí výjimku. Výchozí hodnota této možnosti je false ; kontrola přetečení je zakázaná.
AllowUnsafeBlocks
Možnost kompilátoru AllowUnsafeBlocks umožňuje kód, který používá klíčové slovo unsafe ke kompilaci. Výchozí hodnota pro tuto možnost je false , což znamená, že nezabezpečený kód není povolen.
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
Další informace o nebezpečném kódu naleznete v tématu nezabezpečený kód a ukazatele.
DefineConstants
Možnost DefineConstants definuje symboly ve všech souborech zdrojového kódu vašeho 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 direktiva preprocesoru #define s tím rozdílem, že možnost kompilátoru je platná pro všechny soubory v projektu. Symbol zůstane definován ve zdrojovém souboru, dokud direktiva #undef ve zdrojovém souboru definici odstraní. Použijete-li -define možnost, #undef direktiva v jednom souboru nemá žádný vliv na jiné soubory zdrojového kódu v projektu. Můžete použít symboly vytvořené pomocí této možnosti s #if, #else, #elifa #endif ke podmíněnému kompilování zdrojových souborů. Kompilátor jazyka C# sám nedefinuje žádné symboly nebo makra, které lze použít ve zdrojovém kódu; všechny definice symbolů musí být definované uživatelem.
Poznámka
#defineDirektiva jazyka C# nepovoluje, aby se symbolu předala hodnota, jako v jazycích, jako je například C++. Například #define nelze použít k vytvoření makra nebo k definování konstanty. Pokud potřebujete definovat konstantu, použijte enum proměnnou. Chcete-li vytvořit makro stylu C++, zvažte alternativy jako obecné. Vzhledem k tomu, že makra jsou obvykle odlaďuje náchylné k chybám, C# nepovoluje jejich použití, ale poskytuje bezpečnější alternativy.
Langversion –
Způsobí, že kompilátor přijme pouze syntaxi, která je obsažena ve zvolené specifikaci jazyka C#.
<LangVersion>9.0</LangVersion>
Platné jsou následující hodnoty:
| Hodnota | Význam |
|---|---|
preview |
Kompilátor přijímá všechny platné jazykové syntaxe z nejnovější verze Preview. |
latest |
Kompilátor přijímá syntaxi z nejnovější vydané verze kompilátoru (včetně dílčí verze). |
latestMajor (default) |
Kompilátor přijímá syntaxi z nejnovější vydané hlavní verze kompilátoru. |
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.0 nebo nižší. |
8.0 |
Kompilátor přijímá pouze syntaxi, která je součástí jazyka 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). |
výchozí jazyková verze závisí na cílové architektuře vaší aplikace a na nainstalované verzi sady SDK nebo Visual Studio. Tato pravidla jsou definována ve verzích jazyka C#.
Metadata odkazovaná v aplikaci jazyka C# nepodléhají možnosti kompilátoru langversion – .
Vzhledem k tomu, že každá verze kompilátoru jazyka C# obsahuje rozšíření jazykové specifikace, langversion – neposkytuje ekvivalentní funkce starší verze kompilátoru.
kromě toho i když se aktualizace verze C# obecně shodují s hlavními .NET Framework verzemi, nová syntaxe a funkce nemusí být nutně vázané na konkrétní verzi frameworku. i když nové funkce budou jednoznačně vyžadovat novou aktualizaci kompilátoru, která se také vydává společně s revizí C#, každá konkrétní funkce má své vlastní minimální požadavky na rozhraní .net API nebo modul clr (common language runtime), které by mohly umožňovat jeho spuštění v rámci architektury nižší verze, zahrnutím balíčků NuGet nebo jiných knihoven.
Bez ohledu na to, který langversion – nastavení použijete, použijte aktuální verzi modulu CLR (Common Language Runtime) a vytvořte .exe nebo .dll. Jedinou výjimkou jsou Friend sestavení a moduleassemblyname –, která pracují v rámci -langversion –: ISO-1.
Další způsoby určení verze jazyka C# naleznete v tématu Správa verzí jazyka c#.
Informace o tom, jak nastavit tuto možnost kompilátoru programově, najdete v tématu LanguageVersion .
specifikace jazyka C#
| Verze | Odkaz | Description |
|---|---|---|
| C# 7,0 a novější | Momentálně není k dispozici | |
| C# 6,0 | Propojit | Specifikace jazyka C# verze 6 – neoficiální koncept: .NET Foundation |
| C# 5,0 | Stáhnout PDF | Standard ECMA-334 5. edice |
| C# 3,0 | Stáhnout dokument | Specifikace jazyka C# verze 3,0: Microsoft Corporation |
| C# 2,0 | Stáhnout PDF | Standard ECMA – 334 4. edice |
| C# 1,2 | Stáhnout dokument | Specifikace jazyka C# verze 1,2: Microsoft Corporation |
| C# 1,0 | Stáhnout dokument | Specifikace jazyka C# verze 1,0: Microsoft Corporation |
Minimální verze sady SDK potřebná pro podporu všech funkcí jazyka
V následující tabulce je uveden minimální počet verzí sady SDK s kompilátorem jazyka C#, který podporuje odpovídající jazykovou verzi:
| Verze C# | Minimální verze sady 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 .NET Framework 4,5 kompilátor |
| C# 4 | Microsoft Visual Studio/Build Tools 2010 nebo .NET Framework 4,0 kompilátor |
| C# 3 | Microsoft Visual Studio/Build Tools 2008 nebo .NET Framework 3,5 kompilátor |
| C# 2 | Microsoft Visual Studio/Build Tools 2005 nebo .NET Framework 2,0 kompilátor |
| C# 1.0/1.2 | Microsoft Visual Studio/Build Tools .NET 2002 nebo v sadě .NET Framework 1.0 |
Vynulovatelné
Možnost Nullable umožňuje určit kontext s možnou hodnotou null. Výchozí hodnota pro tuto možnost je disable .
<Nullable>enable</Nullable>
Argument musí být jeden z enable , disable , nebo warnings annotations . Argument enable povoluje kontext s možnou hodnotou null. Zadáním se disable zakáže kontext s možnou hodnotou null. Při poskytování argumentu je povolen kontext upozornění warnings s možnou hodnotou null. Při zadávání argumentu je povolen kontext poznámky s možnou hodnotou annotations null.
Flow analýza slouží k odlišování hodnoty null proměnných ve spustitelném kódu. Odvozená možnost null 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 v Debug.Assert režimu vydání.
Volání metod s poznámkami s následujícími atributy ovlivní také analýzu toku:
- Jednoduché předběžné AllowNullAttribute podmínky: a DisallowNullAttribute
- Jednoduché post-podmínky: MaybeNullAttribute a NotNullAttribute
- Podmíněné podmínky MaybeNullWhenAttribute po: a NotNullWhenAttribute
- DoesNotReturnIfAttribute (například
DoesNotReturnIf(false)pro Debug.Assert ) a DoesNotReturnAttribute - NotNullIfNotNullAttribute
- Po splnění podmínek pro člena: a 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 všechny zdrojové soubory označené jako vygenerované. Existují čtyři způsoby, jak se soubor označí jako vygenerovaný:
- V souboru .editorconfig zadejte
generated_code = truev oddílu, který se vztahuje na tento soubor. - Na
<auto-generated><auto-generated/>začátek souboru dejte nebo . Může být na libovolném řádku v tomto komentáři, ale blok komentáře musí být prvním prvkem v souboru. - Název souboru začněte TemporaryGeneratedFile_
- Název souboru zakončíte .designer.cs, .generated.cs, .g.cs nebo .g.i.cs.
Generátory mohou vyjádřit výslovný souhlas pomocí #nullable direktivy preprocesoru.