言語機能の規則の C# コンパイラ オプション

以下のオプションは、コンパイラが言語機能を解釈する方法を制御します。 新しい MSBuild 構文は、太字 で示されています。 以前の csc.exe 構文は、code style で示されています。

  • CheckForOverflowUnderflow / -checked: オーバーフロー チェックを生成します。
  • AllowUnsafeBlocks / -unsafe: "アンセーフ" コードを許可します。
  • DefineConstants / -define: 条件付きコンパイル シンボルを定義します。
  • 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 です。つまり、アンセーフ コードは許可されていません。

<AllowUnsafeBlocks>true</AllowUnsafeBlocks>

アンセーフ コードの詳細については、「アンセーフ コードとポインター」を参照してください。

DefineConstants

DefineConstants オプションは、プログラムのすべてのソース コード ファイル内のシンボルを定義します。

<DefineConstants>name;name2</DefineConstants>

このオプションは、定義する 1 つまたは複数のシンボルの名前を指定します。 DefineConstants オプションには、#define プリプロセッサ ディレクティブと同じ効果があります。ただし、コンパイラ オプションはプロジェクト内のすべてのファイルに対して有効である点が異なります。 ソース ファイルの #undef ディレクティブがこの定義を削除するまで、シンボルはソース ファイルで定義されたままになります。 -define オプションを使用すると、あるファイルで指定されている #undef ディレクティブは、プロジェクト内の他のソース コード ファイルには影響しません。 このオプションで作成されるシンボルを #if#else#elif、および #endif で使う、ソース ファイルを条件付きでコンパイルできます。 C# コンパイラ自体では、ソース コードで使うことができるシンボルやマクロは定義されません。すべてのシンボル定義はユーザーが定義する必要があります。

注意

C++ などの言語とは異なり、C# の #define ディレクティブでは、シンボルに値を割り当てることはできません。 たとえば、マクロの作成や定数の定義に #define を使うことはできません。 定数を定義する必要がある場合は、enum 変数を使います。 C++ スタイルのマクロを作成する場合は、ジェネリックなどで代用してください。 マクロはエラーを招きやすいため、C# では、マクロの使用は禁止され、代わりに、より安全な方法が提供されています。

LangVersion

コンパイラが、選択した C# 言語仕様に含まれている構文のみを受け入れるようにします。

<LangVersion>9.0</LangVersion>

有効な値は、次のとおりです。

[値] 説明
preview コンパイラは、最新のプレビュー バージョンの有効な言語構文をすべて受け入れます。
latest コンパイラは、最新リリース バージョンのコンパイラ (マイナー バージョンを含む) の構文を受け入れます。
latestMajor (default) コンパイラは、最新リリースのメジャー バージョンのコンパイラの構文を受け入れます。
10.0 コンパイラは、C# 10 以下に含まれている構文のみを受け入れます。
9.0 コンパイラは、C# 9.0 以下に含まれている構文のみを受け入れます。
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) に含まれている構文のみを受け入れます。

既定の言語バージョンは、アプリケーションのターゲット フレームワークやインストールされている SDK または Visual Studio のバージョンに依存します。 これらの規則は、「C# 言語のバージョン管理」で定義されています。

C# アプリケーションで参照されるメタデータは、LangVersion コンパイラ オプションの対象になりません。

C# コンパイラのバージョンごとに言語仕様の拡張機能が含まれているため、LangVersion は、コンパイラの以前のバージョンと同じ機能を提供しません。

さらに、C# バージョンの更新は、一般的に主要な .NET Framework のリリースと一致しますが、新しい構文および機能は必ずしも特定のフレームワーク バージョンに関連付けられていません。 新機能では、C# リビジョンと共にリリースされる新しいコンパイラの更新プログラムを確実に必要としますが、各特定機能には、独自の最小の .NET API または共通言語ランタイムの要件があり、この要件によって、NuGet パッケージやその他のライブラリを含めることで下位レベルのフレームワークで実行できるようになります。

使用する LangVersion の設定に関係なく、現在のバージョンの共通言語ランタイムを使用して .exe や .dll を作成します。 1 つの例外は、 -langversion:ISO-1 の下で機能する、フレンド アセンブリと ModuleAssemblyName です。

C# 言語バージョンを指定するその他の方法については、「C# 言語のバージョン管理」を参照してください。

このコンパイラ オプションをプログラムで設定する方法については、「LanguageVersion」を参照してください。

C# 言語仕様

バージョン Link 説明
C# 7.0 以降 現在、利用できません
C# 6.0 リンク C# 言語仕様バージョン 6 - 非公式ドラフト: .NET Foundation
C# 5.0 PDF のダウンロード Standard ECMA-334 5th Edition
C# 3.0 DOC のダウンロード C# 言語仕様バージョン 3.0:Microsoft Corporation
C# 2.0 PDF のダウンロード Standard ECMA-334 4th Edition
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 Tools .NET 2002 またはバンドルされている .NET Framework 1.0 コンパイラ

Nullable

Nullable オプションを使用すると、Null 許容コンテキストを指定できます。 このオプションの既定値は disable です。

<Nullable>enable</Nullable>

引数は、enabledisablewarningsannotations のいずれかである必要があります。 enable 引数を指定すると、Null 許容コンテキストが有効になります。 disable を指定すると、Null 許容コンテキストは無効になります。 warnings 引数を指定すると、Null 許容の警告コンテキストが有効になります。 annotations 引数を指定すると、Null 許容の注釈コンテキストが有効になります。

フロー分析は、実行可能コード内の変数に null 値が許容されるかどうかを推測するために使用します。 null 値が変数で許容されるかの推定は、変数の宣言されている null 許容とは無関係です。 メソッド呼び出しは、条件付きで省略される場合でも分析されます。 たとえば、リリース モードの Debug.Assert です。

次の属性の注釈が付いたメソッド呼び出しも、フロー分析に影響します。

重要

グローバルな Null 許容コンテキストは、生成されたコード ファイルに適用されません。 この設定でも、Null 許容のコンテキストは、生成済みとしてマークされているすべてのソース ファイルに対して "無効になります"。 ファイルが生成済みとしてマークされる方法は 4 つあります。

  1. .editorconfig で、そのファイルに適用されるセクションで generated_code = true を指定します。
  2. ファイルの先頭にあるコメントに <auto-generated> または <auto-generated/> を配置します。 これは、コメント内の任意の行に配置できますが、コメント ブロックはファイル内の最初の要素である必要があります。
  3. ファイル名を TemporaryGeneratedFile_ で開始します
  4. ファイル名の末尾を .designer.cs.generated.cs.g.cs、または .g.i.cs にします。

ジェネレーターは、#nullable プリプロセッサ ディレクティブを使用してオプトインできます。