Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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: Povolitunsafekó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 naleznete v tématu Možnosti 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 checkForOverflowUnderflow je true, výchozí kontext je kontrolovaná kontext a je povolena kontrola přetečení. Pokud je falsecheckForOverflowUnderflow , výchozí kontext je nezaškrtnutý kontext. Výchozí hodnota této možnosti je false, což znamená, ž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 checkedunchecked .
Informace o tom, jak kontext kontroly přetečení ovlivňuje operace a jaké operace ovlivňuje, 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.
Povolení aktualizovaných pravidel zabezpečení paměti
Aktualizovaná pravidla bezpečnosti paměti jsou funkce preview v jazyce C# 15 a .NET 11. Používají dvě nezávislá nastavení kompilátoru:
- Jazyková
previewverze umožňuje nové odpočinek syntaxe a ukazatele. - Funkce
updated-memory-safety-ruleskompilátoru umožňuje aktualizovaná pravidla, včetně povinností volajících , které vyžadují nebezpečné , a způsobí, že kompilátor zaznamená volbu v sestavení s atributem MemorySafetyRulesAttribute .
Budoucí stabilní vlastnost sady SDK , MemorySafetyRulesje naplánována jako třetí aktivační úroveň pro ukončení funkce verze Preview (například <MemorySafetyRules>2</MemorySafetyRules>), ale tato vlastnost ještě není implementována.
Pro projekt použijte obě nastavení:
<PropertyGroup>
<LangVersion>preview</LangVersion>
<Features>$(Features);updated-memory-safety-rules</Features>
</PropertyGroup>
Pro program založený na souborech přidejte ekvivalentní direktivy:
#:property Features=$(Features);updated-memory-safety-rules
#:property LangVersion=preview
Vlastnost AllowUnsafeBlocks je nezávislá. Určuje, jestli zdroj může použít unsafe klíčové slovo. Projekt může povolit aktualizovaná pravidla bez povolení nebezpečného kódu, v takovém případě při volání vyžaduje nebezpečná rozhraní API.
To, jestli jedno sestavení vynucuje aktualizovaná pravidla proti jinému, závisí na tom, ve které straně se přihlašuje:
-
Aktualizovaný volající modelu, aktualizovaný volaný model: Značky volaných
unsafeprocházejí metadaty. Volající zabalí každý hovor do bloku, který vyžaduje nebezpečného členaunsafe. -
Aktualizovaný volající modelu, volaný původním modelem: Režim kompatibility považuje všechny volané členy s typem ukazatele v podpisu za nebezpečné, takže web volání potřebuje uzavřený
unsafeblok. Tento režim udržuje rozhraní API založené na ukazatelích bezobslužné ztráty svéhounsafepožadavku. - Volající původního modelu, aktualizovaný volaný model: Původní pravidla ukazatele stále platí. Člen, který nemá v podpisu žádný typ ukazatele, se může volat z bezpečného kódu, protože volající původního modelu nemůže přečíst nové značky.
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 měl hodnotu, například v jazycích, jako je C++. Například #define nelze vytvořit makro nebo definovat konstantu. Pokud potřebujete definovat konstantu, použijte proměnnou enum . Pokud chcete vytvořit makro ve 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í
Nenastavujte LangVersion prvek na latesthodnotu . Nastavení latest znamená, že nainstalovaný kompilátor používá nejnovější verzi. Tato verze se může změnit z počítače na počítač a vytvářet nespolehlivé buildy. Kromě toho umožňuje funkce jazyka, které můžou 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>
Některé funkce ve verzi Preview vyžadují kromě toho samostatnou výslovný souhlas <LangVersion>preview</LangVersion>. Například aktualizovaná pravidla zabezpečení paměti c# 15 používají funkci kompilátoru updated-memory-safety-rules . Další informace naleznete v tématu Povolení aktualizovaných pravidel zabezpečení paměti.
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). |
latestMajornebo default |
Kompilátor přijímá syntaxi z nejnovější vydané hlavní verze kompilátoru. |
15.0 |
Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 15 nebo nižší. |
14.0 |
Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 14 nebo nižší. |
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-2nebo 2 |
Kompilátor přijímá pouze syntaxi, která je součástí ISO/IEC 23270:2006 C# (2.0). |
ISO-1nebo 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 . Aktualizujte cílovou architekturu pro přístup k novějším jazykových funkcím.
Zadání s hodnotou se liší od vynechání
default. Určenídefaultpouží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.Možnost kompilátoru LangVersion nemá vliv na metadata odkazovaná vaší aplikací jazyka C#.
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í .NET rozhraní API nebo běžné požadavky na modul runtime jazyka, 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 | nástroje Microsoft Visual Studio/Build Tools 2017 |
| C# 6 | nástroje 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é
Pomocí možnosti Nullable zadejte kontext s možnou hodnotou null. Nastavte ji v konfiguraci projektu pomocí značky <Nullable> :
<Nullable>enable</Nullable>
Argument musí být jeden z enable, disable, warningsnebo annotations. Argument enable zapne kontext s možnou hodnotou null. Argument disable vypne kontext s možnou hodnotou null. Argument warnings zapne kontext upozornění s možnou hodnotou null. Argument annotations zapne kontext poznámek s možnou hodnotou null. Další informace o těchtohodnotách Další informace o povolení referenčních typů s možnou hodnotou null ve stávajícím základu kódu najdete v tématu Strategie migrace s možnou hodnotou null.
Poznámka:
Pokud hodnotu nenastavíte, výchozí hodnota je disable. Nicméně, .NET 6 a novější šablony nastavují hodnotu enableNullable ve výchozím nastavení.
Analýza toku odvodí hodnotu nullability proměnných v rámci spustitelného kódu. Odvozená nullability proměnné je nezávislá na deklarované nullability proměnné. Kompilátor analyzuje volání metody, i když je volání podmíněně vynecháno z kompilovaného výstupu. Kompilátor například stále analyzuje volání s ohledem na Debug.Assert nulovou hodnotu, i když je volání podmíněné a není kompilováno do sestavení vydaných verzí.
Vyvolání metod anotovaných s následujícími atributy má vliv také na analýzu toku:
- Jednoduché předpoklady: AllowNullAttribute a DisallowNullAttribute
- Jednoduché postconditions: MaybeNullAttribute a NotNullAttribute
- Podmíněné postconditions: MaybeNullWhenAttribute a NotNullWhenAttribute
-
DoesNotReturnIfAttribute (například
DoesNotReturnIf(false)pro Debug.Assert) a DoesNotReturnAttribute - NotNullIfNotNullAttribute
- Postconditions člena: MemberNotNullAttribute(String) a 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 se označí jako vygenerovaný jedním z následujících způsobů:
- V souboru .editorconfig zadejte
generated_code = truev oddílu, který se vztahuje na tento soubor. - Zahrňte
<auto-generated>nebo<auto-generated/>do komentáře v horní části souboru. Můžete ho umístit na libovolný řádek v 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 mohou přihlásit pomocí direktivy preprocesoru #nullable .