C#言語バージョン一覧|.NET別の対応表・確認方法・変更方法をわかりやすく解説
はじめに
C#では、使用する言語バージョンによって記述できる構文や利用可能な機能が変わります。たとえば、C# 12ではコレクション式、C# 13ではparamsコレクション、C# 14では拡張メンバーなどが追加されました。
ただし、C#言語バージョンは単独で決まるものではありません。.NETのターゲットフレームワーク、インストールされている.NET SDK、Visual Studio、C#コンパイラが相互に関係します。
本記事では、C#言語バージョンの一覧、.NETとの対応関係、現在のバージョンを確認する方法、LangVersionを使った変更方法、エラーが発生した場合の対処法を解説します。
1. C#言語バージョンとは
1-1. C#言語バージョンによって利用できる機能が変わる
C#言語バージョンとは、C#コンパイラが受け付ける言語仕様の範囲を表すものです。
たとえば、次のコレクション式はC# 12で追加されました。
C#int[] numbers = [1, 2, 3, 4, 5];
プロジェクトがC# 11以下を使用している場合、このコードはコンパイルできません。「コレクション式はC# 11では使用できません」のようなエラーが発生します。
言語バージョンを新しくすると、新しい構文を使用できるだけでなく、パターンマッチング、非同期処理、型推論、メモリ効率などに関する改善も利用できます。一方で、古い開発環境やターゲットフレームワークとの互換性には注意が必要です。
1-2. C#・.NET・.NET SDK・コンパイラの違い
C#言語バージョンを理解するには、次の4つを区別する必要があります。
| 項目 | 役割 |
|---|---|
| C# | プログラムを記述するための言語とその仕様 |
| .NET | C#プログラムを実行するランタイムや標準ライブラリを含む開発・実行基盤 |
| .NET SDK | コンパイラ、CLI、MSBuild、テンプレートなどをまとめた開発ツール |
| C#コンパイラ | C#のソースコードをアセンブリへ変換するソフトウェア。現在は主にRoslynが使用される |
C#の新しい構文を認識するのはコンパイラです。しかし、言語機能によっては新しいランタイム動作やライブラリ型が必要になります。そのため、コンパイラだけを新しくしても、すべての新機能を古い.NETで使用できるとは限りません。Microsoft Learn+1
1-3. C#言語バージョンはターゲットフレームワークから自動選択される
現在のSDKスタイルプロジェクトでは、通常、C#言語バージョンを明示的に指定する必要はありません。
プロジェクトファイルに次のようなターゲットフレームワークが指定されているとします。
XML<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>
この場合、既定のC#言語バージョンとしてC# 14が選択されます。同様に、net8.0ではC# 12、net9.0ではC# 13が選択されます。
この自動選択は、言語機能とランタイムの不整合を防ぐための仕組みです。Microsoftも、特別な理由がなければLangVersionを指定せず、ターゲットフレームワークの既定値を使用することを推奨しています。Microsoft Learn+1
1-4. 最新の正式版とプレビュー版の違い
2026年6月時点の最新正式版はC# 14です。C# 14は2025年11月にリリースされ、.NET 10で正式にサポートされています。
次期バージョンのC# 15はプレビュー段階で、.NET 11 Preview SDKおよび対応するVisual Studio 2026 Insidersで試すことができます。プレビュー機能は正式リリースまでに仕様、構文、動作が変更される可能性があります。Microsoft Learn+1
正式版は長期的な互換性を考慮してリリースされています。一方、プレビュー版は新機能の評価やフィードバックを目的としており、安定性が重視される本番システムでは慎重な判断が必要です。
2. C#言語バージョン一覧
2-1. C# 1.0~C# 6のリリース時期と主な機能
| バージョン | リリース時期 | 主な機能 |
|---|---|---|
| C# 1.0 | 2002年1月 | クラス、構造体、インターフェイス、プロパティ、イベント、デリゲート、属性 |
| C# 1.2 | 2003年4月 | foreachにおけるIEnumerator.Disposeの呼び出しなど |
| C# 2.0 | 2005年11月 | ジェネリック、匿名メソッド、null許容値型、反復子、部分型 |
| C# 3.0 | 2007年11月 | LINQ、ラムダ式、拡張メソッド、匿名型、式ツリー、var |
| C# 4.0 | 2010年4月 | dynamic、名前付き引数、省略可能な引数、ジェネリックの共変・反変 |
| C# 5.0 | 2012年8月 | async、await、呼び出し元情報属性 |
| C# 6.0 | 2015年7月 | 文字列補間、null条件演算子、nameof、例外フィルター、式形式のメンバー |
C# 2.0のジェネリック、C# 3.0のLINQ、C# 5.0のasyncとawaitは、その後のC#プログラミングに大きな影響を与えた機能です。C# 6では、既存の処理をより簡潔に記述するための機能が多く追加されました。Microsoft Learn
2-2. C# 7.0・7.1・7.2・7.3のリリース時期と主な機能
| バージョン | リリース時期 | 主な機能 |
|---|---|---|
| C# 7.0 | 2017年3月 | タプル、分解、パターンマッチング、ローカル関数、out変数、破棄 |
| C# 7.1 | 2017年8月 | async Main、defaultリテラル、タプル要素名の推論 |
| C# 7.2 | 2017年11月 | inパラメーター、ref readonly、readonly struct、ref struct、private protected |
| C# 7.3 | 2018年5月 | タプルの等値比較、ジェネリック制約の拡張、stackallocやfixedの改善 |
C# 7.1以降は、メジャーバージョンの途中で小規模な機能を追加するポイントリリースが導入されました。C# 7.2と7.3では、値型や参照渡しを活用したパフォーマンス改善が中心となっています。Microsoft Learn+2
Microsoft Learn+2
2-3. C# 8.0のリリース時期と主な機能
C# 8.0は2019年9月にリリースされました。
主な機能は次のとおりです。
null許容参照型
非同期ストリーム
switch式
プロパティパターン、タプルパターン、位置指定パターン
既定のインターフェイスメンバー
インデックスと範囲
using宣言
null合体代入演算子
静的ローカル関数
C# 8.0は.NET Coreを中心に設計された最初の主要なC#リリースです。既定のインターフェイス実装など、一部の機能は新しいランタイム機能を必要とします。Microsoft Learn
2-4. C# 9.0のリリース時期と主な機能
C# 9.0は2020年11月に.NET 5とともにリリースされました。
主な機能は次のとおりです。
レコード
init専用セッタートップレベルステートメント
リレーショナルパターンと論理パターン
ターゲット型による
new式ネイティブサイズ整数
関数ポインター
共変戻り値型
モジュール初期化子
特にレコードとinit専用セッターにより、変更されにくいデータオブジェクトを簡潔に定義できるようになりました。Microsoft Learn+1
2-5. C# 10のリリース時期と主な機能
C# 10は2021年11月に.NET 6とともにリリースされました。
主な機能は次のとおりです。
レコード構造体
global usingファイルスコープ名前空間
補間文字列ハンドラー
ラムダ式の自然型
ラムダ式の戻り値型と属性
拡張プロパティパターン
CallerArgumentExpression
ファイルスコープ名前空間やglobal usingは、定型コードを減らし、ソースコードを読みやすくする機能です。Microsoft Learn
2-6. C# 11のリリース時期と主な機能
C# 11は2022年11月に.NET 7とともにリリースされました。
主な機能は次のとおりです。
raw文字列リテラル
必須メンバー
ジェネリック数学
静的抽象インターフェイスメンバー
UTF-8文字列リテラル
リストパターン
ジェネリック属性
ファイルローカル型
refフィールドとscoped ref
raw文字列リテラルを使用すると、JSON、XML、SQLなど、引用符や改行を多く含む文字列を記述しやすくなります。Microsoft Learn
2-7. C# 12のリリース時期と主な機能
C# 12は2023年11月に.NET 8とともにリリースされました。
主な機能は次のとおりです。
クラスと構造体のプライマリコンストラクター
コレクション式
インライン配列
ラムダ式の省略可能なパラメーター
ref readonlyパラメーター任意の型に対する
using別名試験段階のAPIを示す属性
コレクション式では、配列やリストなどを共通した簡潔な構文で初期化できます。
C#int[] values = [1, 2, 3];
List<string> names = ["Alice", "Bob"];
2-8. C# 13のリリース時期と主な機能
C# 13は2024年11月に.NET 9とともにリリースされました。
主な機能は次のとおりです。
paramsコレクションSystem.Threading.Lockに対応した新しいlock\eエスケープシーケンスオブジェクト初期化子での末尾からのインデックス
イテレーターと非同期メソッドにおける
refローカルやunsaferef structによるインターフェイス実装ref structを許可するジェネリック制約部分プロパティと部分インデクサー
オーバーロード解決の優先順位
従来のparamsは主に配列で使用していましたが、C# 13ではSpan<T>や一定のコレクション型にも適用できます。Microsoft Learn+1
2-9. C# 14のリリース時期と主な機能
C# 14は2025年11月に.NET 10とともに正式リリースされました。
主な機能は次のとおりです。
拡張メンバー
null条件付き代入
バインドされていないジェネリック型に対する
nameofSpan<T>とReadOnlySpan<T>の暗黙的変換の拡張型を省略したラムダパラメーターへの修飾子
fieldでサポートされるプロパティ部分イベントと部分コンストラクター
ユーザー定義複合代入演算子
ファイルベースアプリ向けプリプロセッサディレクティブ
null条件付き代入では、nullチェックを簡潔に記述できます。
C#customer?.Order = GetCurrentOrder();
拡張メンバーでは、従来の拡張メソッドに加えて、拡張プロパティや型に対する静的な拡張メンバーを定義できます。Microsoft Learn+2
Microsoft Learn+2
2-10. C# 15プレビューで追加予定の主な機能
2026年6月時点で、C# 15はプレビュー版です。.NET 11 Preview SDKで公開されている主な機能には、次のものがあります。
コレクション式の引数
union型
closed階層
コレクション式の引数では、コレクションの容量や比較方法などを指定できます。
C#List<string> names =
[
with(capacity: 100),
"Alice",
"Bob"
];
union型は、値が複数の候補型のいずれかであることを表します。
C#public record Cat(string Name);
public record Dog(string Name);
public union Pet(Cat, Dog);
closed階層では、直接の派生型を同一アセンブリ内に限定し、switch式の網羅性判定に利用できます。
C#public closed record class Result;
public record Success(string Value) : Result;
public record Failure(string Message) : Result;
これらはプレビュー機能であり、正式リリースまでに仕様や実装状況が変わる可能性があります。Microsoft Learn+1
3. C#言語バージョンと.NETの対応表
3-1. .NET 5以降とC#言語バージョンの対応表
| ターゲットフレームワーク | TFM | 既定のC#言語バージョン |
|---|---|---|
| .NET 5 | net5.0 | C# 9.0 |
| .NET 6 | net6.0 | C# 10 |
| .NET 7 | net7.0 | C# 11 |
| .NET 8 | net8.0 | C# 12 |
| .NET 9 | net9.0 | C# 13 |
| .NET 10 | net10.0 | C# 14 |
| .NET 11 Preview | net11.0 | C# 15プレビュー |
.NET 11とC# 15は、2026年6月時点ではプレビュー版です。正式な本番環境では、安定版である.NET 10とC# 14までを基本とします。Microsoft Learn+1
3-2. .NET CoreとC#言語バージョンの対応表
| ターゲット | 既定のC#言語バージョン |
|---|---|
| .NET Core 3.x | C# 8.0 |
| .NET Core 2.x | C# 7.3 |
| .NET Core 1.x | 現行の公式対応表では個別に定義されていないため、使用するSDK・コンパイラの確認が必要 |
.NET Core 3.xは、null許容参照型や非同期ストリームなどを含むC# 8.0に対応します。.NET Core 2.xの既定値はC# 7.3です。Microsoft Learn
3-3. .NET StandardとC#言語バージョンの対応表
| ターゲット | 既定のC#言語バージョン |
|---|---|
| .NET Standard 2.1 | C# 8.0 |
| .NET Standard 2.0 | C# 7.3 |
| .NET Standard 1.x | C# 7.3 |
.NET Standardは、特定のランタイムではなく、複数の.NET実装で利用できるAPI仕様です。.NET Frameworkにも対応する汎用ライブラリを作成する場合は、現在でも.NET Standard 2.0が選択されることがあります。なお、.NET Frameworkは.NET Standard 2.1をサポートしていません。Microsoft Learn+1
3-4. .NET FrameworkとC#言語バージョンの対応表
Microsoftの現在の対応表では、すべての.NET Frameworkを対象として、既定のC#言語バージョンはC# 7.3です。
| ターゲット | 既定のC#言語バージョン |
|---|---|
| .NET Framework 4.8.1 | C# 7.3 |
| .NET Framework 4.8 | C# 7.3 |
| .NET Framework 4.7.x | C# 7.3 |
| その他の.NET Framework | C# 7.3 |
新しいRoslynコンパイラを使用すると、一部の新しい構文をコンパイルできる場合があります。しかし、ターゲットフレームワークに関連付けられたバージョンより新しいC#言語バージョンの使用は、現在のMicrosoft公式ドキュメントではサポート対象外とされています。Microsoft Learn+1
3-5. ターゲットフレームワーク別に選択される既定のC#バージョン
代表的な対応関係をまとめると、次のようになります。
| ターゲット | 既定のC# |
|---|---|
| .NET 11.x | C# 15 |
| .NET 10.x | C# 14 |
| .NET 9.x | C# 13 |
| .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・1.x | C# 7.3 |
| .NET Framework | C# 7.3 |
LangVersionを省略した場合は、この対応関係と使用中のSDKに基づいて言語バージョンが決まります。Microsoft Learn
3-6. 古い.NETで新しいC#言語バージョンを使う際の制限
新しいコンパイラが構文を認識できても、次の理由で古い.NETでは利用できないことがあります。
必要な型がターゲットフレームワークに存在しない
CLRに必要な機能が実装されていない
コンパイラが必要な属性やメタデータを出力できない
新しい標準ライブラリAPIを参照できない
実行時に
TypeLoadExceptionやMissingMethodExceptionなどが発生するソースジェネレーターやアナライザーが古いコンパイラに対応していない
たとえば、既定のインターフェイス実装には.NET Core 3.0または.NET 5以降、インターフェイスの静的抽象メンバーには.NET 7以降のランタイムサポートが必要です。LangVersionだけを変更しても、ランタイム要件に関するエラーは解決できません。Microsoft Learn
4. C#言語バージョンを確認する方法
4-1. Visual Studioのプロジェクトプロパティで確認する
Visual Studioでは、プロジェクトを右クリックしてプロパティを開き、[ビルド]の[詳細設定]から選択されている言語バージョンを確認できます。
ただし、SDKスタイルプロジェクトでは、ターゲットフレームワークから自動選択されるため、言語バージョンの選択欄が無効になっていることがあります。現在のVisual Studioでは、UIから変更するのではなく、ターゲットフレームワークまたはcsprojファイルを編集する方法が基本です。Microsoft Learn
4-2. csprojファイルのLangVersionで確認する
プロジェクトファイルを開き、LangVersion要素を探します。
XML<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<LangVersion>13</LangVersion>
</PropertyGroup>
</Project>
LangVersionが記述されていれば、原則としてその設定が使用されます。
記述がない場合は、ターゲットフレームワークに対応する既定値が使用されます。Directory.Build.propsに設定されている可能性もあるため、csprojだけでなく、親ディレクトリの共通設定も確認してください。
4-3. TargetFrameworkから既定のC#バージョンを確認する
LangVersionがない場合は、TargetFrameworkを確認します。
XML<TargetFramework>net8.0</TargetFramework>
net8.0はC# 12、net9.0はC# 13、net10.0はC# 14が既定です。
複数のターゲットを指定している場合は、次のように記述されます。
XML<TargetFrameworks>net8.0;net10.0</TargetFrameworks>
各ターゲットは個別にビルドされるため、同じソースコードがそれぞれのターゲットでコンパイルできる必要があります。
4-4. コード内の「#error version」でコンパイラ情報を確認する
実際に使用されているコンパイラと言語バージョンを確認したい場合は、C#ファイルに次の1行を一時的に追加します。
C##error version
ビルドすると、エラーCS8304としてコンパイラバージョンと選択されたC#言語バージョンが表示されます。
確認後は、この行を削除してください。versionは大文字と小文字が区別されます。Microsoft Learn
4-5. dotnetコマンドでインストール済みの.NET SDKを確認する
インストール済みのSDKは、次のコマンドで確認できます。
Bashdotnet --list-sdks
現在のディレクトリで実際に選択されるSDKは、次のコマンドで確認します。
Bashdotnet --version
OS、SDK、ランタイム、アーキテクチャなどの詳細情報は、次のコマンドで確認できます。
Bashdotnet --info
dotnet --versionの結果は、global.jsonの影響を受けます。インストール済みの最新SDKと、実際に選択されるSDKが同じとは限りません。Microsoft Learn
4-6. global.jsonで固定されている.NET SDKを確認する
リポジトリのルートや親ディレクトリにglobal.jsonがある場合、使用する.NET SDKが固定されている可能性があります。
JSON{
"sdk": {
"version": "10.0.100",
"rollForward": "latestFeature"
}
}
この例では、10.0.100以上の.NET 10 SDKから、利用可能な最新の機能バンドとパッチが選択されます。
global.jsonはプロジェクトのターゲットランタイムを指定するファイルではありません。ビルドに使用する.NET SDKを選択するためのファイルです。Microsoft Learn
5. C#言語バージョンを変更する方法
5-1. csprojファイルにLangVersionを指定する
C#言語バージョンを明示的に変更する場合は、csprojのPropertyGroupにLangVersionを追加します。
XML<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<LangVersion>14</LangVersion>
</PropertyGroup>
ただし、ターゲットフレームワークの既定より新しいC#バージョンを指定することは推奨されません。新しい言語機能が必要な場合は、原則としてターゲットフレームワークも更新します。
5-2. C# 12やC# 13など特定のバージョンを指定する
C# 12を固定する場合は、次のように設定します。
XML<LangVersion>12</LangVersion>
C# 13を固定する場合は、次のように設定します。
XML<LangVersion>13</LangVersion>
C# 14の場合は次のとおりです。
XML<LangVersion>14</LangVersion>
特定の数値を指定すると、開発者のPCやCI環境でSDKのパッチバージョンが多少異なっても、使用できるC#構文の範囲を統一しやすくなります。
5-3. default・latest・latestMajor・previewの違い
| 設定値 | 意味 |
|---|---|
default | コンパイラが対応する最新の正式メジャーバージョン |
latestMajor | コンパイラが対応する最新の正式メジャーバージョン |
latest | コンパイラが対応する最新の正式バージョン。マイナーバージョンを含む |
preview | コンパイラが対応する最新プレビュー版 |
| 数値 | 指定したC#バージョン以下の構文を使用 |
特に注意したいのは、LangVersionを省略することと、<LangVersion>default</LangVersion>を指定することは異なる点です。
LangVersionを省略すると、ターゲットフレームワークに対応する既定値が使用されます。一方、defaultを明示すると、ターゲットフレームワークを考慮せず、そのコンパイラがサポートする最新の正式メジャーバージョンが選択されます。Microsoft Learn+1
また、latestは開発環境ごとに結果が変わる可能性があります。再現可能なビルドが必要なプロジェクトでは、使用を避けるのが安全です。Microsoft Learn
5-4. Directory.Build.propsで複数プロジェクトを一括変更する
複数のプロジェクトで同じC#言語バージョンを使用する場合は、ソリューションのルートにDirectory.Build.propsを作成します。
XML<Project>
<PropertyGroup>
<LangVersion>14</LangVersion>
</PropertyGroup>
</Project>
このファイルが置かれたディレクトリと、その下のサブディレクトリにあるプロジェクトへ設定が適用されます。
一部のプロジェクトだけ対象外にしたい場合は、条件を追加するか、各プロジェクト側で値を上書きします。Microsoft Learn
5-5. コマンドラインのlangversionオプションを使用する
.NET CLIから一時的に言語バージョンを指定する場合は、MSBuildプロパティとして渡せます。
Bashdotnet build -p:LangVersion=13
Windows環境では、次の形式も利用できます。
Bashdotnet build /p:LangVersion=13
C#コンパイラを直接実行する場合は、-langversionオプションを使用します。
Bashcsc -langversion:13 Program.cs
通常のSDKスタイルプロジェクトでは、cscを直接実行するより、csprojまたはdotnet buildで設定する方法が適しています。
5-6. .NET SDKとターゲットフレームワークを更新する
新しいC#を正式に使用する最も安全な方法は、次の3つをそろえて更新することです。
.NET SDK
ターゲットフレームワーク
Visual Studioまたはビルド環境
たとえば、C# 14を使用する場合は、.NET 10 SDKをインストールして、プロジェクトをnet10.0へ更新します。
XML<TargetFramework>net10.0</TargetFramework>
Visual Studioで新しいターゲットフレームワークを使用する場合は、Visual Studioと.NET SDKの対応状況も確認します。.NET 10の正式なターゲット設定にはVisual Studio 2026が使用されます。Microsoft Learn
5-7. プレビュー版のC#機能を有効にする
最新のプレビュー構文を使用するには、LangVersionをpreviewに設定します。
XML<PropertyGroup>
<TargetFramework>net11.0</TargetFramework>
<LangVersion>preview</LangVersion>
</PropertyGroup>
C# 15プレビューの場合は、対応する.NET 11 Preview SDKとVisual Studio 2026 Insidersが必要です。
また、Visual StudioではプレビューSDKの使用を許可する設定が必要になる場合があります。[ツール]、[オプション]、[環境]、[プレビュー機能]から、プレビュー版.NET SDKの使用に関する設定を確認します。Microsoft Learn+1
6. Visual StudioでC#言語バージョンを変更できない場合の対処法
6-1. 言語バージョンの選択欄が無効になる理由
現在のSDKスタイルプロジェクトでは、C#言語バージョンはターゲットフレームワークから自動的に選択されます。
そのため、Visual Studioのプロジェクトプロパティに表示される言語バージョンの選択欄が無効でも、異常ではありません。互換性のない組み合わせをUIから選択できないようにする設計です。Microsoft Learn
基本的には、次のどちらかで変更します。
ターゲットフレームワークを更新する
csprojを編集してLangVersionを指定する
6-2. Visual Studioと.NET SDKの対応状況を確認する
新しい.NET SDKをインストールしても、Visual StudioがそのSDKに対応していなければ、プロジェクトを正常に読み込めないことがあります。
確認する項目は次のとおりです。
Visual Studioのバージョン
インストール済み.NET SDK
プロジェクトの
TargetFrameworkglobal.jsonで選択されるSDKVisual Studio Installerで必要なワークロードが導入されているか
Visual Studioに対応する.NET SDKには最低バージョンが定められています。SDKだけを先行して更新した場合、コマンドラインではビルドできても、Visual Studioではターゲット設定がサポートされないことがあります。Microsoft Learn
6-3. csprojを直接編集してLangVersionを設定する
Visual StudioのUIで変更できない場合は、プロジェクトを右クリックし、[プロジェクトファイルの編集]からcsprojを開きます。
XML<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<LangVersion>13</LangVersion>
</PropertyGroup>
古い形式のプロジェクトでは、プロジェクトを一度アンロードしてから編集する必要がある場合があります。
6-4. 必要な.NET SDKがインストールされているか確認する
次のコマンドを実行します。
Bashdotnet --list-sdks
必要なSDKが一覧にない場合は、対象バージョンの.NET SDKをインストールします。
ランタイムだけをインストールしても開発やコンパイルはできません。C#コンパイラやMSBuildを使用するには、.NET Runtimeではなく.NET SDKが必要です。
6-5. global.jsonによるSDKの固定を解除・変更する
新しいSDKをインストールしているのに古いSDKが選ばれる場合は、global.jsonを確認します。
JSON{
"sdk": {
"version": "8.0.100",
"rollForward": "disable"
}
}
rollForwardがdisableの場合、指定したSDKとの完全一致が必要です。
使用可能な新しい.NET 8 SDKへ更新を許可する場合は、次のように変更できます。
JSON{
"sdk": {
"version": "8.0.100",
"rollForward": "latestFeature"
}
}
不要な固定であればglobal.jsonを削除する方法もあります。ただし、チームやCIでSDKを統一するために置かれている可能性があるため、削除前に運用方針を確認してください。Microsoft Learn
6-6. プロジェクトの再読み込みとキャッシュ削除を行う
設定を変更してもVisual Studioへ反映されない場合は、次の順序で確認します。
プロジェクトを再読み込みする
Visual Studioを再起動する
binとobjディレクトリを削除するソリューションディレクトリの
.vsを削除するdotnet cleanを実行するコンパイラサーバーを終了する
Bashdotnet build-server shutdown
その後、再度ビルドします。
Bashdotnet restore
dotnet build
キャッシュを削除しても改善しない場合は、診断ログを出力します。
Bashdotnet build --verbosity diagnostic
ログ内のSDKパス、LangVersion、TargetFrameworkを確認すると、意図しない設定の上書きを見つけやすくなります。
7. C#言語バージョンに関するエラーと解決方法
7-1. 「機能はC#○○では使用できません」と表示される場合
次のようなエラーは、コードが要求するC#バージョンより、プロジェクトの言語バージョンが古い場合に発生します。
機能 'コレクション式' は C# 11 では使用できません。
C# 12.0 以上の言語バージョンをお使いください。
対処法は次のいずれかです。
ターゲットフレームワークを更新する
LangVersionを必要なバージョンへ変更する新しい構文を古い構文へ書き換える
たとえば、C# 12を有効にするには次のように設定します。
XML<LangVersion>12</LangVersion>
ただし、ターゲットフレームワークの更新が可能なら、net8.0へ更新して既定のC# 12を使用する方法が推奨されます。Microsoft Learn
7-2. 指定したLangVersionが認識されない場合
次のような原因が考えられます。
使用中の.NET SDKやコンパイラが古い
バージョン文字列に誤りがある
先頭に不要なゼロがある
Directory.Build.propsなどで上書きされているglobal.jsonが古いSDKを選択している
有効な値の例は次のとおりです。
XML<LangVersion>7.3</LangVersion>
<LangVersion>8.0</LangVersion>
<LangVersion>12</LangVersion>
<LangVersion>14</LangVersion>
<LangVersion>preview</LangVersion>
014や存在しないバージョンを指定すると、CS1617などのエラーになります。Microsoft Learn
7-3. 新しいC#機能がコンパイルできない場合
LangVersionが正しくてもコンパイルできない場合は、次の順序で確認します。
#error versionで実際の言語バージョンを確認するdotnet --versionで選択中のSDKを確認するdotnet --list-sdksで必要なSDKがあるか確認するglobal.jsonを確認するDirectory.Build.propsを確認するターゲットフレームワークが機能をサポートするか確認する
Visual Studioのバージョンを確認する
IDE上のコード解析と、実際のビルドで異なるコンパイラが使われているケースにも注意が必要です。
7-4. コンパイルできても実行時に問題が起きる場合
新しいC#構文の中には、コンパイル時の変換だけで完結するものがあります。そのような機能は古いランタイムでも動く可能性があります。
一方、次のような機能はランタイムやライブラリのサポートを必要とします。
既定のインターフェイス実装
インターフェイスの静的抽象メンバー
refフィールドインライン配列
by-ref-like型を利用するジェネリック機能
必要なランタイム機能がない場合、LangVersionだけを上げても解決できません。TargetFrameworkも対応バージョンへ更新する必要があります。Microsoft Learn
7-5. NuGetパッケージが要求するC#バージョンを満たせない場合
通常のNuGetパッケージはコンパイル済みのアセンブリとして配布されるため、利用側のC#言語バージョンを直接要求しないことが一般的です。主に問題となるのは、パッケージが対応するターゲットフレームワークとAPIです。
ただし、次のパッケージではコンパイラやC#言語バージョンが影響する場合があります。
ソースコードを直接含むパッケージ
ソースジェネレーター
アナライザー
新しいRoslyn APIを使用するビルドツール
新しいC#構文を生成するパッケージ
解決方法としては、.NET SDKを更新する、パッケージの古い互換バージョンを使用する、ターゲットフレームワークごとにパッケージバージョンを切り替える、といった方法があります。
7-6. CI/CD環境とローカル環境でビルド結果が異なる場合
ローカルでは成功し、CI/CD環境では失敗する場合、SDKやコンパイラの違いが主な原因です。
次の情報を両方の環境で比較します。
Bashdotnet --version
dotnet --info
dotnet --list-sdks
CI/CDでは、使用するSDKを明示的にインストールし、global.jsonでも範囲を固定すると再現性が高まります。
JSON{
"sdk": {
"version": "10.0.100",
"rollForward": "latestFeature",
"allowPrerelease": false
}
}
LangVersion=latestやpreviewを使用すると、SDK更新によって突然ビルド結果が変わる可能性があります。安定したCIでは、ターゲットフレームワークの既定値または特定の言語バージョンを使用します。Microsoft Learn+1
8. プロジェクトに適したC#言語バージョンの選び方
8-1. 原則としてターゲットフレームワークの既定値を使用する
特別な事情がなければ、LangVersionを記述せず、ターゲットフレームワークから自動選択されるC#言語バージョンを使用します。
XML<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>
この設定ならC# 14が選択されます。言語とランタイムの組み合わせがMicrosoftの想定範囲に収まり、アップグレード手順も分かりやすくなります。Microsoft Learn+1
8-2. チーム開発では言語バージョンと.NET SDKを固定する
チーム開発では、次の2つを分けて管理します。
C#言語バージョン:
TargetFrameworkまたはLangVersionビルドに使うSDK:
global.json
たとえば、.NET 10の範囲でSDK更新を許可する場合は次のようにします。
JSON{
"sdk": {
"version": "10.0.100",
"rollForward": "latestFeature",
"allowPrerelease": false
}
}
言語バージョンを明示的に固定する必要がある場合は、Directory.Build.propsを使用できます。
XML<Project>
<PropertyGroup>
<LangVersion>14</LangVersion>
</PropertyGroup>
</Project>
8-3. latestの指定を避けたほうがよいケース
次のようなプロジェクトでは、latestを避けたほうが安全です。
CI/CDで再現可能なビルドが必要
複数の開発者が異なるSDKを使用する
長期間保守する業務システム
ライブラリをNuGetで公開する
複数のOSやビルドエージェントを使用する
SDK更新を自動化している
latestは、その環境にインストールされているコンパイラによって意味が変わります。同じソースでも、マシンごとに利用可能な構文が異なる状態になり得ます。Microsoft Learn+1
8-4. previewを本番環境で使用する際の注意点
previewでは、正式リリース前の構文やコンパイラ機能を使用できます。しかし、次のリスクがあります。
正式版で構文が変更される
コンパイラの不具合が残っている
IDEやアナライザーが対応していない
ライブラリやビルドツールとの互換性がない
次のPreview SDKで動作が変わる
サポートポリシーが正式版と異なる
本番環境で使用する場合は、SDKを厳密に固定し、アップグレード前に回帰テストを実施できる体制が必要です。
8-5. .NET Frameworkを継続利用する場合の判断基準
.NET Frameworkを継続する場合は、C#言語バージョンだけでなく、アプリケーション全体の制約を確認します。
継続が現実的なケースには、次のようなものがあります。
Windows専用の既存システム
ASP.NET Web Formsを使用している
古いWCFサーバー機能に依存している
COMや社内専用ライブラリへの依存が大きい
移行コストが事業上の効果を上回る
一方、長期的に新しいC#機能、クロスプラットフォーム、コンテナー、クラウドネイティブ機能を活用したい場合は、段階的に.NET 8以降や.NET 10へ移行することを検討します。
8-6. C#と.NETをアップグレードする際の確認項目
アップグレード時は、次の項目を確認します。
対象.NETバージョンのサポート期間
Visual Studioと.NET SDKの対応
NuGetパッケージの対応ターゲット
非推奨APIや破壊的変更
ソースジェネレーターとアナライザー
テストプロジェクトやビルドスクリプト
CI/CD環境のSDK
Dockerのベースイメージ
デプロイ先に必要なランタイム
nullable警告や新しいコンパイラ警告
シリアライズ結果やリフレクション動作
パフォーマンスとメモリ使用量
C#はソース互換性を重視していますが、新しいコンパイラではオーバーロード解決や警告が改善され、以前とは異なる診断が発生する場合があります。アップグレード後は、コンパイル成功だけでなくテスト結果も確認します。Microsoft Learn+1
9. C#言語バージョンに関するよくある質問
9-1. C#の最新バージョンは何ですか
2026年6月時点の最新正式版はC# 14です。.NET 10で正式にサポートされています。
次期バージョンのC# 15はプレビュー段階で、.NET 11 Preview SDKを使用して試すことができます。Microsoft Learn+1
9-2. .NETのバージョンを変えずにC#だけ更新できますか
LangVersionを指定すれば、コンパイラが対応している範囲でC#言語バージョンだけを変更できる場合があります。
XML<LangVersion>12</LangVersion>
ただし、ターゲットフレームワークより新しいC#バージョンの使用は公式にはサポートされていません。また、ランタイムや標準ライブラリに依存する機能は利用できないことがあります。
新しいC#を正式な組み合わせで使用するには、ターゲットフレームワークも更新するのが原則です。
9-3. .NET Framework 4.8ではどのC#バージョンを使用できますか
Microsoftの現在の対応表では、.NET Framework 4.8の既定のC#言語バージョンはC# 7.3です。
新しいコンパイラを導入してLangVersionを変更すると、一部の新しい構文がコンパイルできることはあります。しかし、すべての機能が動作するわけではなく、ターゲットフレームワークの既定より新しいC#バージョンは公式サポート外です。Microsoft Learn
9-4. LangVersionを指定しない場合はどうなりますか
プロジェクトのターゲットフレームワークに応じた既定のC#言語バージョンが選択されます。
たとえば、次のようになります。
net8.0:C# 12net9.0:C# 13net10.0:C# 14.NET Framework:C# 7.3
通常は、LangVersionを指定しない設定が推奨されます。Microsoft Learn
9-5. latestとpreviewは何が違いますか
latestは、使用中のコンパイラがサポートする最新の正式版を選択します。
previewは、正式リリースされていない最新のプレビュー構文も有効にします。
XML<LangVersion>latest</LangVersion>
XML<LangVersion>preview</LangVersion>
どちらもSDKやコンパイラの更新によって意味が変化します。特にpreviewは仕様変更の可能性があるため、本番システムでは慎重に使用します。
9-6. Visual Studioの更新だけでC#のバージョンも上がりますか
Visual Studioを更新すると、新しいC#コンパイラや.NET SDKがインストールされることがあります。
ただし、LangVersionを省略している既存プロジェクトでは、ターゲットフレームワークに応じた既定値が維持されます。たとえば、Visual Studioを更新しても、net8.0プロジェクトの既定値はC# 12のままです。
C# 14を既定で使用するには、基本的にターゲットをnet10.0へ更新します。
9-7. C#言語バージョンを下げることはできますか
LangVersionへ古いバージョンを指定すれば、使用可能な構文を制限できます。
XML<LangVersion>10</LangVersion>
ただし、次の点に注意が必要です。
新しい構文を使用しているコードはコンパイルできない
ソースジェネレーターが新しい構文を生成する可能性がある
古いC#コンパイラそのものを再現するわけではない
参照するアセンブリのメタデータは
LangVersionの制限対象ではない新しいコンパイラの警告やオーバーロード解決は残る場合がある
LangVersionを下げても、過去のコンパイラと完全に同じ動作になるわけではありません。Microsoft Learn
9-8. 複数のターゲットフレームワークで言語バージョンはどう決まりますか
複数のターゲットフレームワークを指定すると、それぞれのターゲットについて個別のビルドが行われます。
XML<TargetFrameworks>net8.0;net10.0</TargetFrameworks>
LangVersionを省略した場合、各ターゲットに対応する既定の言語バージョンが使用されます。ただし、同じソースコードを各ターゲットでビルドするため、実質的には古いターゲットでもコンパイルできるコードにそろえる必要があります。
ターゲットごとに指定を変える場合は、条件付きのPropertyGroupを使用できます。
XML<PropertyGroup Condition="'$(TargetFramework)' == 'net8.0'">
<LangVersion>12</LangVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(TargetFramework)' == 'net10.0'">
<LangVersion>14</LangVersion>
</PropertyGroup>
ターゲットごとに異なるコードが必要な場合は、条件付きコンパイルも使用できます。
C##if NET10_0
// .NET 10向けの処理
#else
// それ以前のターゲット向けの処理
#endif
まとめ
C#言語バージョンは、利用できる構文や言語機能を決める設定です。しかし、C#だけで独立しているわけではなく、ターゲットフレームワーク、.NET SDK、Visual Studio、C#コンパイラと密接に関係しています。
2026年6月時点の最新正式版はC# 14で、.NET 10に対応しています。C# 15は.NET 11とともにプレビュー提供されており、union型やclosed階層などの機能が試験的に公開されています。
通常のプロジェクトでは、LangVersionを指定せず、ターゲットフレームワークから自動選択される既定値を使用するのが安全です。明示的に変更する場合は、csprojやDirectory.Build.propsを使用し、言語機能だけでなくランタイムとライブラリの対応状況も確認してください。
ビルド環境を安定させるには、global.jsonで.NET SDKを管理し、ローカル環境とCI/CD環境のバージョンをそろえることも重要です。

