言語機能の規則の 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>

CheckForOverflowUnderflowtrue の場合、既定のコンテキストはチェック済みのコンテキストであり、オーバーフロー チェックが有効になります。それ以外の場合、既定のコンテキストはチェックされないコンテキストになります。 このオプションの既定値は false です。つまり、オーバーフロー チェックは無効になっています。

checkedunchecked ステートメントを使用して、コードの各部分のオーバーフロー チェック コンテキストを明示的に制御することもできます。

オーバーフロー チェック コンテキストが演算に与える影響と、影響を受ける演算については、checkedunchecked ステートメントに関する記事をご覧ください。

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# コンパイラの既定の言語バージョンは、アプリケーションのターゲット フレームワークと、インストールされている SDK または Visual Studio のバージョンによって異なります。 これらの規則は、「C# 言語のバージョン管理」で定義されています。

LangVersion オプションを指定すると、コンパイラは、指定した C# 言語仕様に含まれる構文のみを受け入れます。次に例を示します:

<LangVersion>9.0</LangVersion>

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

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

重要

通常、この latest 値は推奨されません。 latest では、コンパイラは、構成されたターゲット フレームワークに含まれていない更新プログラムにこれらの機能が依存している場合でも、最新の機能を有効にします。

考慮事項

  • プロジェクトでターゲット フレームワークに推奨される既定のコンパイラ バージョンが使用されるようにするには、LangVersion オプションを使用しないでください。 より新しい言語機能にアクセスするために、ターゲット フレームワークを更新できます。

  • default 値で LangVersion を 指定することは、LangVersion オプションを省略することとは異なります。 default 指定では、ターゲット フレームワークを考慮せずに、コンパイラがサポートする最新バージョンの言語が使用されます。 たとえば、Visual Studio バージョン 17.6 から .NET 6 を対象とするプロジェクトをビルドする場合、LangVersion が指定されていない場合 は C# 10 が使用されますが、LangVersiondefault に設定されている場合 は C# 11 が使用されます。

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

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

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

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

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

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

C# 言語仕様

バージョン Link 説明
C# 8.0 以降 PDF のダウンロード C# 言語仕様使用バージョン 7: .NET Foundation
C# 7.3 PDF のダウンロード Standard ECMA-334 7th Edition
C# 6.0 PDF のダウンロード Standard ECMA-334 6th Edition
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 のダウンロード 標準 ECMA-334 2nd Edition
C# 1.0 DOC のダウンロード 標準 ECMA-334 1st Edition

すべての言語機能をサポートするために必要な SDK の最小バージョン

次の表は、SDK の最小バージョンに対応する言語バージョンをサポートする C# コンパイラを示しています。

C# バージョン SDK の最小バージョン
C# 12 Microsoft Visual Studio/Build Tools 2022 バージョン 17.8、または .NET 8 SDK
C# 11 Microsoft Visual Studio/Build Tools 2022、バージョン 17.4、または .NET 7 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 許容コンテキストを指定できます。 プロジェクトの構成で <Nullable> タグを使用して設定できます。

<Nullable>enable</Nullable>

引数は、enabledisablewarningsannotations のいずれかである必要があります。 enable 引数を指定すると、Null 許容コンテキストが有効になります。 disable を指定すると、Null 許容コンテキストは無効になります。 warnings 引数を指定すると、Null 許容の警告コンテキストが有効になります。 annotations 引数を指定すると、Null 許容の注釈コンテキストが有効になります。 値については、 Null 許容コンテキストに関する記事で説明します。 既存のコードベースで null 許容参照型を有効にするタスクの詳細については、null 許容移行戦略に関する記事を参照してください。

注意

値が設定されていない場合、既定値 disable が適用されます。ただし、既定では、.NET 6 テンプレートは Nullable 値が enable に設定されています。

フロー分析は、実行可能コード内の変数に 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 プリプロセッサ ディレクティブを使用してオプトインできます。