C# 言語のバージョン管理

最新の C# コンパイラでは、プロジェクトのターゲット フレームワーク (1 つまたは複数) に基づいて既定の言語バージョンが決定されます。 Visual Studio には値を変更するための UI がありませんが、それは csproj ファイルを編集することで変更できます。 既定値を選択すれば、ターゲット フレームワークと互換性がある最新の言語バージョンが使用されます。 プロジェクトのターゲットと互換性がある最新の言語機能にアクセスできるという利点があります。 また、このように既定値を選択すると、ターゲット フレームワークで利用できない型や実行時動作を必要とする言語が使用されません。 既定値より新しい言語バージョンを選択すると、コンパイル時間や実行時エラーの診断が困難になることがあります。

C# 12 は、.NET 8 以降のバージョンでのみサポートされています。 C# 11 は、.NET 7 以降のバージョンでのみサポートされています。 C# 10 は、.NET 6 以降のバージョンでのみサポートされています。

Visual Studio のバージョンと.NET バージョンの対応表が必要な場合、Visual Studio プラットフォーム互換性ページをご覧ください。 Visual Studio for Mac のバージョンと.NET バージョンの対応表が必要な場合、Visual Studio for Mac プラットフォーム互換性ページをご覧ください。 C# バージョンと Mono の互換性については、C# の Mono ページを参照してください。

既定値

コンパイラでは、以下の規則に基づいて既定値が決定されます。

移行先 Version C# 言語の既定のバージョン
.NET 8.x C# 12
.NET 7.x C# 11
.NET 6.x C# 10
.NET 5.x C# 9.0
.NET Core 3.x C# 8.0
.NET Core 2.x C# 7.3
.NET Standard 2.1 C# 8.0
.NET Standard 2.0 C# 7.3
.NET Standard 1.x C# 7.3
.NET Framework すべて C# 7.3

ご自分のプロジェクトが、対応するプレビュー言語バージョンを持つ preview フレームワークをターゲットにしている場合、使用される言語バージョンはプレビュー言語バージョンです。 環境を問わず、そのプレビューでは最新の機能が使用されます。リリース済みの .NET Core バージョンをターゲットにするプロジェクトに影響はありません。

重要

Visual Studio 2017 の新しいプロジェクト テンプレートによって、新しいプロジェクト ファイルに <LangVersion>latest</LangVersion> エントリが追加されました。 これらのプロジェクトのターゲット フレームワークをアップグレードすると、<LangVersion> 設定により新しいターゲット フレームワークの既定値がオーバーライドされます。 お使いのプロジェクトがターゲット フレームワークに推奨されるコンパイラ バージョンを使用するようにするには、必ずプロジェクト ファイルから <LangVersion>latest</LangVersion> を削除してください。 より新しい言語機能にアクセスするために、ターゲット フレームワークを更新できます。

既定値をオーバーライドする

C# のバージョンを明示的に指定する必要がある場合は、いくつかの方法で実行できます。

ヒント

プロジェクト プロパティ ページで Visual Studio の言語バージョンを確認できます。 [ビルド] タブの下の [詳細設定] ページに選択されているバージョンが表示されます。

現在使用している言語バージョンを確認するには、コードに #error version を入れます (大文字と小文字を区別します)。 このようにすると、コンパイラによって、コンパイラ エラー CS8304 と、使用されているコンパイラのバージョンと現在選択されている言語バージョンが含まれるメッセージが報告されます。 詳細については、「#error (C# リファレンス)」を参照してください。

プロジェクト ファイルを編集する

プロジェクト ファイルで言語のバージョンを設定できます。 たとえば、プレビュー機能に明示的にアクセスしたい場合は、次のように要素を追加します。

<PropertyGroup>
   <LangVersion>preview</LangVersion>
</PropertyGroup>

preview では、コンパイラでサポートされている使用可能な最新のプレビュー C# 言語バージョンが使用されます。

複数のプロジェクトを構成する

複数のプロジェクトを構成するには、<LangVersion> 要素を含む Directory.build.props ファイルを (通常はソリューション ディレクトリに) 作成します。 以下の設定を Directory.Build.props ファイルに追加します。:

<Project>
 <PropertyGroup>
   <LangVersion>preview</LangVersion>
 </PropertyGroup>
</Project>

そのファイルが含まれるディレクトリのすべてのサブディレクトリ内のビルドで、プレビュー C# バージョンが使用されるようになります。 詳細については、「ビルドのカスタマイズ」を参照してください。

C# 言語バージョン リファレンス

次の表では、現在のすべての C# 言語バージョンを示します。 古いコンパイラでは、すべての値が解釈されない場合があります。 最新の .NET SDK をインストールすると、一覧表示されているすべてにアクセスできます。

説明
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) に含まれている構文のみを受け入れます。

Note

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