言語機能の規則の C# コンパイラ オプション
以下のオプションは、コンパイラが言語機能を解釈する方法を制御します。 新しい MSBuild 構文は、太字で示されています。 以前の csc.exe 構文は、code style
で示されています。
- CheckForOverflowUnderflow /
-checked
: オーバーフロー チェックを生成します。 - AllowUnsafeBlocks /
-unsafe
: "アンセーフ" コードを許可します。 - DefineConstants /
-define
: 条件付きコンパイル シンボルを定義します。 - LangVersion /
-langversion
:default
(最新のメジャー バージョン)、latest
(マイナー バージョンを含む最新バージョン) などの言語バージョンを指定します。 - Nullable /
-nullable
: Null 許容コンテキスト (Null 許容警告) を有効にします。
Note
プロジェクトでこれらのオプションを構成する方法の詳細については、コンパイラ オプションを参照してください。
CheckForOverflowUnderflow
CheckForOverflowUnderflow オプションは、整数演算がオーバーフローした場合にプログラムの動作を定義する既定のオーバーフロー チェック コンテキストを制御します。
<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
CheckForOverflowUnderflow が true
の場合、既定のコンテキストはチェック済みのコンテキストであり、オーバーフロー チェックが有効になります。それ以外の場合、既定のコンテキストはチェックされないコンテキストになります。 このオプションの既定値は false
です。つまり、オーバーフロー チェックは無効になっています。
checked
と unchecked
ステートメントを使用して、コードの各部分のオーバーフロー チェック コンテキストを明示的に制御することもできます。
オーバーフロー チェック コンテキストが演算に与える影響と、影響を受ける演算については、checked
と unchecked
ステートメントに関する記事をご覧ください。
AllowUnsafeBlocks
AllowUnsafeBlocks コンパイラ オプションは、unsafe キーワードを使用するコードをコンパイルできるようにします。 このオプションの既定値は false
です。つまり、アンセーフ コードは許可されていません。
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
アンセーフ コードの詳細については、「アンセーフ コードとポインター」を参照してください。
DefineConstants
DefineConstants オプションは、プログラムのすべてのソース コード ファイル内のシンボルを定義します。
<DefineConstants>name;name2</DefineConstants>
このオプションは、定義する 1 つまたは複数のシンボルの名前を指定します。 DefineConstants オプションには、#define プリプロセッサ ディレクティブと同じ効果があります。ただし、コンパイラ オプションはプロジェクト内のすべてのファイルに対して有効である点が異なります。 ソース ファイルの #undef ディレクティブがこの定義を削除するまで、シンボルはソース ファイルで定義されたままになります。 -define
オプションを使用すると、あるファイルで指定されている #undef
ディレクティブは、プロジェクト内の他のソース コード ファイルには影響しません。 このオプションで作成されるシンボルを #if、#else、#elif、および #endif で使う、ソース ファイルを条件付きでコンパイルできます。 C# コンパイラ自体では、ソース コードで使うことができるシンボルやマクロは定義されません。すべてのシンボル定義はユーザーが定義する必要があります。
Note
C++ などの言語とは異なり、C# の #define
ディレクティブでは、シンボルに値を割り当てることはできません。 たとえば、マクロの作成や定数の定義に #define
を使うことはできません。 定数を定義する必要がある場合は、enum
変数を使います。 C++ スタイルのマクロを作成する場合は、ジェネリックなどで代用してください。 マクロはエラーを招きやすいため、C# では、マクロの使用は禁止され、代わりに、より安全な方法が提供されています。
LangVersion
C# コンパイラの既定の言語バージョンは、アプリケーションのターゲット フレームワークと、インストールされている SDK または Visual Studio のバージョンによって異なります。 これらの規則は、「C# 言語のバージョン管理」で定義されています。
警告
LangVersion
要素を latest
に設定することは推奨されていません。 latest
設定にすると、インストールされているコンパイラで最新バージョンが使用されます。 これはマシンによって変わり、ビルドの信頼性が低下する可能性があります。 さらに、現在の SDK に含まれていないランタイム機能またはライブラリ機能を必要とする可能性がある言語機能も有効になります。
LangVersion オプションを指定すると、コンパイラは、指定した C# 言語仕様に含まれる構文のみを受け入れます。次に例を示します:
<LangVersion>9.0</LangVersion>
有効な値は、次のとおりです。
値 | 説明 |
---|---|
preview |
コンパイラは、最新のプレビュー バージョンの有効な言語構文をすべて受け入れます。 |
latest |
コンパイラは、最新リリース バージョンのコンパイラ (マイナー バージョンを含む) の構文を受け入れます。 |
latestMajor または default |
コンパイラは、最新リリースのメジャー バージョンのコンパイラの構文を受け入れます。 |
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 が使用されますが、LangVersion がdefault
に設定されている場合 は 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>
引数は、enable
、disable
、warnings
、annotations
のいずれかである必要があります。 enable
引数を指定すると、Null 許容コンテキストが有効になります。 disable
を指定すると、Null 許容コンテキストは無効になります。 warnings
引数を指定すると、Null 許容の警告コンテキストが有効になります。 annotations
引数を指定すると、Null 許容の注釈コンテキストが有効になります。 値については、 Null 許容コンテキストに関する記事で説明します。 既存のコードベースで null 許容参照型を有効にするタスクの詳細については、null 許容移行戦略に関する記事を参照してください。
Note
値が設定されていない場合、既定値 disable
が適用されます。ただし、既定では、.NET 6 テンプレートは Nullable 値が enable
に設定されています。
フロー分析は、実行可能コード内の変数に null 値が許容されるかどうかを推測するために使用します。 null 値が変数で許容されるかの推定は、変数の宣言されている null 許容とは無関係です。 メソッド呼び出しは、条件付きで省略される場合でも分析されます。 たとえば、リリース モードの Debug.Assert です。
次の属性の注釈が付いたメソッド呼び出しも、フロー分析に影響します。
- 単純な実行前条件: AllowNullAttribute と DisallowNullAttribute
- 単純な実行後条件: MaybeNullAttribute と NotNullAttribute
- 条件付きの実行後条件: MaybeNullWhenAttribute および NotNullWhenAttribute
- DoesNotReturnIfAttribute (
DoesNotReturnIf(false)
の Debug.Assert など) と DoesNotReturnAttribute - NotNullIfNotNullAttribute
- メンバーの実行後条件: MemberNotNullAttribute(String) と MemberNotNullAttribute(String[])
重要
グローバルな Null 許容コンテキストは、生成されたコード ファイルに適用されません。 この設定でも、Null 許容のコンテキストは、生成済みとしてマークされているすべてのソース ファイルに対して "無効になります"。 ファイルが生成済みとしてマークされる方法は 4 つあります。
- .editorconfig で、そのファイルに適用されるセクションで
generated_code = true
を指定します。 - ファイルの先頭にあるコメントに
<auto-generated>
または<auto-generated/>
を配置します。 これは、コメント内の任意の行に配置できますが、コメント ブロックはファイル内の最初の要素である必要があります。 - ファイル名を TemporaryGeneratedFile_ で開始します
- ファイル名の末尾を .designer.cs、 .generated.cs、 .g.cs、または .g.i.cs にします。
ジェネレーターは、#nullable
プリプロセッサ ディレクティブを使用してオプトインできます。
.NET