語言功能規則的 c # 編譯器選項

下列選項控制編譯器如何解讀語言功能。 新的 MSBuild 語法會以 粗體 顯示。 舊版的 csc.exe 語法如下所示 code style

  • CheckForOverflowUnderflow / -checked :產生溢位檢查。
  • AllowUnsafeBlocks / -unsafe :允許「unsafe」程式碼。
  • >Defineconstants / -define : (s) 定義條件式編譯符號。
  • LangVersion / -langversion :指定語言版本,例如 default (最新的主要版本) ,或 latest (最新版本,包括) 的次要版本。
  • Nullable / -nullable :啟用可為 null 的內容,或可為 null 的警告。

CheckForOverflowUnderflow

CheckForOverflowUnderflow 選項會指定產生值超出資料類型範圍的整數算術語句是否導致執行時間例外狀況。

<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>

在或關鍵字範圍內的整數算術語句, checked unchecked 不受 CheckForOverflowUnderflow 選項的影響。 如果不在或關鍵字範圍內的整數算術語句 checked unchecked 產生超出資料類型範圍的值,而 CheckForOverflowUnderflowtrue ,則該語句會在執行時間造成例外狀況。 如果 CheckForOverflowUnderflowfalse ,該語句就不會在執行時間造成例外狀況。 此選項的預設值為 false ; 停用溢位檢查。

AllowUnsafeBlocks

AllowUnsafeBlocks 編譯器選項可讓使用 unsafe關鍵字的程式碼進行編譯。 此選項的預設值為 false ,表示不允許 unsafe 程式碼。

<AllowUnsafeBlocks>true</AllowUnsafeBlocks>

如需 Unsafe 程式碼的詳細資訊,請參閱 Unsafe 程式碼和指標

DefineConstants

>Defineconstants 選項會定義程式所有原始程式碼檔中的符號。

<DefineConstants>name;name2</DefineConstants>

此選項會指定您要定義的一或多個符號名稱。 >Defineconstants 選項與 #define預處理器指示詞的效果相同,不同之處在于編譯器選項對專案中的所有檔案都有效。 直到原始程式檔中的 #undef 指示詞移除符號的定義之前,符號在原始程式檔中都會維持已定義狀態。 當您使用 -define 選項時,某個檔案中的指示詞 #undef 不會影響專案中的其他原始程式碼檔。 您可以使用此選項建立的符號,搭配 #if#else#elif#endif,有條件地編譯原始程式檔。 C# 編譯器本身不會定義任何您可以在原始程式碼中使用的符號或巨集;所有符號定義都必須是使用者定義。

注意

C # #define 指示詞不允許提供值給符號,如同 c + + 等語言。 例如,#define 不能用來建立巨集或定義常數。 如果您需要定義常數,請使用 enum 變數。 如果您想要建立 C++ 樣式巨集,請考慮替代項目,例如泛型。 由於巨集非常可能發生錯誤,因此 C# 不允許使用巨集,而是提供較為安全的替代項目。

LangVersion

讓編譯器只接受所選擇 C# 語言規格中所含的語法。

<LangVersion>9.0</LangVersion>

下列是有效值:

意義
preview 編譯器會接受最新預覽版本的所有有效語言語法。
latest 編譯器會接受編譯器最新已發行版本 (包括次要版本) 的語法。
latestMajor (default) 編譯器會接受編譯器最新已發行主要版本的語法。
10.0 編譯器只會接受 c # 10 或更低版本中所含的語法。
9.0 編譯器只會接受 c # 9 或更低版本中所含的語法。
8.0 編譯器只會接受 C# 8.0 或更低版本中所含的語法。
7.3 編譯器只會接受 C# 7.3 或更低版本中所含的語法。
7.2 編譯器只會接受 C# 7.2 或更低版本中所含的語法。
7.1 編譯器只會接受 C# 7.1 或更低版本中所含的語法。
7 編譯器只會接受 C# 7.0 或更低版本中所含的語法。
6 編譯器只會接受 C# 6.0 或更低版本中所含的語法。
5 編譯器只會接受 C# 5.0 或更低版本中所含的語法。
4 編譯器只會接受 C# 4.0 或更低版本中所含的語法。
3 編譯器只會接受 C# 3.0 或更低版本中所含的語法。
ISO-2 (或 2) 編譯器只會接受 ISO/IEC 23270:2006 c # (2.0) 中所含的語法。
ISO-1 (或 1) 編譯器只會接受 ISO/IEC 23270:2003 c # (1.0/1.2) 中所含的語法。

預設語言版本取決於您應用程式的目標 Framework,以及安裝的 SDK 或 Visual Studio 版本。 這些規則會以 c # 語言版本設定來定義。

C # 應用程式所參考的中繼資料不會受限於 LangVersion 編譯器選項。

因為每個版本的 c # 編譯器都包含語言規格的延伸模組,所以 LangVersion 不會提供您舊版編譯器的對等功能。

此外,雖然 c # 版本更新通常會與主要 .NET Framework 版本一致,但是新的語法和功能不一定會系結至該特定架構版本。 雖然新功能一定需要也要與 C# 修訂一起發行的新編譯器更新,但是每個特定功能都有自己的最低 .NET API 或通用語言執行平台需求,可讓它包含 NuGet 套件或其他程式庫以在舊版架構上執行。

無論您使用哪一種 LangVersion 設定,請使用目前版本的 common language runtime 來建立您的 .exe 或 .dll。 其中一個例外狀況是 friend 元件和 ModuleAssemblyName,其使用 -langversion: ISO-1

如需其他指定 c # 語言版本的方法,請參閱 c # 語言版本控制

如需如何以程式設計方式設定這個編譯器選項的詳細資訊,請參閱 LanguageVersion

C# 語言規格

版本 連結 描述
C# 7.0 與更新版本 目前無法使用
C# 6.0 連結 C# 語言規格版本 6 - 非官方草稿:.NET Foundation
C# 5.0 下載 PDF 標準 ECMA-334 第 5 版
C# 3.0 下載 DOC C# 語言規格版本 3.0:Microsoft Corporation
C# 2.0 下載 PDF 標準 ECMA-334 第 4 版
C# 1.2 下載 DOC C# 語言規格版本 1.2:Microsoft Corporation
C# 1.0 下載 DOC C# 語言規格版本 1.0:Microsoft Corporation

支援所有語言功能所需的最低 SDK 版本

下表列出 SDK 的最小版本,以及支援對應語言版本的 c # 編譯器:

C # 版本 最低 SDK 版本
C # 10 Microsoft Visual Studio/Build Tools 2022 或 .net 6 SDK
C# 9.0 Microsoft Visual Studio/Build Tools 2019、16.8 版或 .net 5 SDK
C# 8.0 Microsoft Visual Studio/Build Tools 2019、16.3 版或 .net Core 3.0 SDK
C# 7.3 Microsoft Visual Studio/Build Tools 2017 15.7 版
C# 7.2 Microsoft Visual Studio/Build Tools 2017 15.5 版
C# 7.1 Microsoft Visual Studio/Build Tools 2017 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 或配套的 .NET Framework 4.5 編譯器
C# 4 Microsoft Visual Studio/Build Tools 2010 或配套的 .NET Framework 4.0 編譯器
C # 3 Microsoft Visual Studio/Build Tools 2008 或配套的 .NET Framework 3.5 編譯器
C # 2 Microsoft Visual Studio/Build Tools 2005 或配套的 .NET Framework 2.0 編譯器
C # 1.0/1。2 Microsoft Visual Studio/Build 工具 .net 2002 或配套 .NET Framework 1.0 編譯器

Nullable

為 null 的選項可讓您指定可為 null 的內容。 此選項的預設值為 disable

<Nullable>enable</Nullable>

引數必須是 enable 、、或的其中一個 disable warnings annotationsenable引數會啟用可為 null 的內容。 指定 disable 將會停用可為 null 的內容。 提供 warnings 引數時,會啟用可為 null 的警告內容。 當指定 annotations 引數時,會啟用可為 null 的注釋內容。

Flow 分析是用來推斷可執行程式碼內變數的可 null 性。 變數的推斷 null 屬性與變數宣告的可 null 性無關。 即使是有條件地省略方法呼叫,也會進行分析。 例如, Debug.Assert 在發行模式中。

以下列屬性標注之方法的調用也會影響流程分析:

重要

全域可為 null 的內容不適用於產生的程式碼檔案。 無論這項設定為何,任何標示為已產生的原始程式檔都會 停用 可為 null 的內容。 有四種方式可將檔案標示為已產生:

  1. 在 editorconfig 中,指定 generated_code = true 套用至該檔案的區段。
  2. <auto-generated> 檔案 <auto-generated/> 頂端的批註中放入或。 它可以位於批註中的任何一行,但批註區塊必須是檔案中的第一個元素。
  3. 使用 TemporaryGeneratedFile_ 開始檔案名
  4. .cs..cs、 g.g.. .cs 結尾的檔案名結尾。 .cs。

產生器可以使用預處理器指示詞來加入宣告 #nullable