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

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

  • CheckForOverflowUnderflow / -checked: オーバーフロー チェックを生成します。
  • AllowUnsafeBlocks / -unsafe: コード unsafe 許可します。
  • DefineConstants / -define: 条件付きコンパイル シンボルを定義します。
  • LangVersion / -langversion: default (最新のメジャー バージョン)、latest (マイナー バージョンを含む最新バージョン) などの言語バージョンを指定します。
  • Nullable / -nullable: Null 許容コンテキスト (Null 許容警告) を有効にします。

Note

プロジェクトに対してこれらのオプションを構成する方法の詳細については、「 コンパイラ オプション」を参照してください。

CheckForOverflowUnderflow

CheckForOverflowUnderflow オプションは、整数演算がオーバーフローした場合にプログラムの動作を定義する既定のオーバーフロー チェック コンテキストを制御します。

<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>

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

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

オーバーフロー チェック コンテキストが操作に与える影響とその影響については、checkedステートメントとuncheckedステートメントに関する記事を参照してください。

AllowUnsafeBlocks

AllowUnsafeBlocks コンパイラ オプションは、unsafe キーワードを使用するコードをコンパイルできるようにします。 このオプションの既定値は false です。つまり、アンセーフ コードは許可されていません。

<AllowUnsafeBlocks>true</AllowUnsafeBlocks>

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

更新されたメモリ安全規則を有効にする

更新されたメモリ安全規則は、C# 15 および .NET 11 のプレビュー機能です。 2 つの独立したコンパイラ設定を使用します。

  • preview言語バージョンでは、新しい構文とポインターの緩和が可能になります。
  • updated-memory-safety-rules コンパイラ機能を使用すると、呼び出し元の義務が必要な場合など、更新された規則が有効になり、コンパイラはアセンブリ内の選択を MemorySafetyRulesAttribute 属性で記録します。

将来の安定した SDK プロパティ ( MemorySafetyRules) は、機能がプレビューを終了したとき (たとえば、 <MemorySafetyRules>2</MemorySafetyRules>) の 3 番目のアクティブ化レベルとして計画されていますが、そのプロパティはまだ実装されていません。

プロジェクトの場合は、次の両方の設定を使用します。

<PropertyGroup>
  <LangVersion>preview</LangVersion>
  <Features>$(Features);updated-memory-safety-rules</Features>
</PropertyGroup>

ファイル ベースのプログラムの場合は、同等のディレクティブを追加します。

#:property Features=$(Features);updated-memory-safety-rules
#:property LangVersion=preview

AllowUnsafeBlocks プロパティは独立しています。 ソースが unsafe キーワードを使用できるかどうかを制御します。 プロジェクトでは、安全でないコードを許可せずに更新されたルールを有効にすることができます。その場合、アンセーフ API が必要な場合にエラーを受け取ります。

あるアセンブリが別のアセンブリに対して更新された規則を適用するかどうかは、どの側がオプトインするかによって異なります。

  • 更新されたモデル呼び出し元、更新されたモデルの呼び出し先: 呼び出し先の unsafe マーカーはメタデータを通過します。 呼び出し元は、 unsafe ブロック内の必須の安全でないメンバーへの各呼び出しをラップします。
  • 更新されたモデル呼び出し元、元のモデルの呼び出し先: 互換性モードでは、シグネチャにポインター型を持つすべての呼び出し先メンバーを requires-unsafe として扱うので、呼び出しサイトには外側の unsafe ブロックが必要です。 このモードでは、ポインターベースの API が unsafe の要件を警告なく失うのを防ぐ。
  • 元のモデル呼び出し元、更新されたモデル呼び出し先: 元のポインター規則が引き続き適用されます。 シグネチャにポインター型がない requires-unsafe メンバーは、元のモデルの呼び出し元が新しいマーカーを読み取ることができないため、安全なコードから呼び出し可能になります。

DefineConstants

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

<DefineConstants>name;name2</DefineConstants>

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

Note

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

LangVersion

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

警告

LangVersion要素をlatestに設定しないでください。 latest 設定にすると、インストールされているコンパイラで最新バージョンが使用されます。 そのバージョンはマシン間で変更され、ビルドの信頼性が低下する可能性があります。 さらに、現在の SDK に含まれていないランタイム機能またはライブラリ機能を必要とする可能性がある言語機能も有効になります。

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

<LangVersion>9.0</LangVersion>

一部のプレビュー機能では、 <LangVersion>preview</LangVersion>に加えて個別のオプトインが必要です。 たとえば、C# 15 の更新されたメモリ安全規則では、 updated-memory-safety-rules コンパイラ機能が使用されます。 詳細については、「 更新されたメモリの安全性規則を有効にする」を参照してください。

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

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

考慮事項

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

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

  • LangVersion コンパイラ オプションは、C# アプリケーションによって参照されるメタデータには影響しません。

  • 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 第 7 版
C# 6.0 PDF のダウンロード Standard ECMA-334 第 6 版
C# 5.0 PDF のダウンロード Standard ECMA-334 第 5 版
C# 3.0 DOC のダウンロード C# 言語仕様バージョン 3.0:Microsoft Corporation
C# 2.0 PDF のダウンロード Standard ECMA-334 第 4 版
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/ビルド ツール 2017
C# 6 Microsoft Visual Studio/ビルド ツール 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

Null 許容コンテキストを指定するには、Null 許容オプションを使用します。 <Nullable> タグを使用して、プロジェクトの構成で設定します。

<Nullable>enable</Nullable>

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

Note

値を設定しない場合、既定値は disable。 ただし、.NET 6 以降のテンプレートでは、Null 許容値が既定でenableに設定されます。

フロー分析は、実行可能コード内の変数の null 許容を推論します。 null 値が変数で許容されるかの推定は、変数の宣言されている null 許容とは無関係です。 コンパイラは、コンパイルされた出力から呼び出しが条件付きで省略された場合でも、メソッド呼び出しを分析します。 たとえば、コンパイラは、呼び出しが条件付きで、リリース ビルドにコンパイルされていない場合でも、 Debug.Assert の呼び出しを分析して null 値を許容します。

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

重要

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

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

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