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#プログラムを記述するための言語とその仕様
.NETC#プログラムを実行するランタイムや標準ライブラリを含む開発・実行基盤
.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.02002年1月クラス、構造体、インターフェイス、プロパティ、イベント、デリゲート、属性
C# 1.22003年4月foreachにおけるIEnumerator.Disposeの呼び出しなど
C# 2.02005年11月ジェネリック、匿名メソッド、null許容値型、反復子、部分型
C# 3.02007年11月LINQ、ラムダ式、拡張メソッド、匿名型、式ツリー、var
C# 4.02010年4月dynamic、名前付き引数、省略可能な引数、ジェネリックの共変・反変
C# 5.02012年8月asyncawait、呼び出し元情報属性
C# 6.02015年7月文字列補間、null条件演算子、nameof、例外フィルター、式形式のメンバー

C# 2.0のジェネリック、C# 3.0のLINQ、C# 5.0のasyncawaitは、その後のC#プログラミングに大きな影響を与えた機能です。C# 6では、既存の処理をより簡潔に記述するための機能が多く追加されました。Microsoft Learn

2-2. C# 7.0・7.1・7.2・7.3のリリース時期と主な機能

バージョンリリース時期主な機能
C# 7.02017年3月タプル、分解、パターンマッチング、ローカル関数、out変数、破棄
C# 7.12017年8月async Main、defaultリテラル、タプル要素名の推論
C# 7.22017年11月inパラメーター、ref readonlyreadonly structref structprivate protected
C# 7.32018年5月タプルの等値比較、ジェネリック制約の拡張、stackallocfixedの改善

C# 7.1以降は、メジャーバージョンの途中で小規模な機能を追加するポイントリリースが導入されました。C# 7.2と7.3では、値型や参照渡しを活用したパフォーマンス改善が中心となっています。Microsoft Learn+2Microsoft 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"];

Microsoft Learn

2-8. C# 13のリリース時期と主な機能

C# 13は2024年11月に.NET 9とともにリリースされました。

主な機能は次のとおりです。

  • paramsコレクション

  • System.Threading.Lockに対応した新しいlock

  • \eエスケープシーケンス

  • オブジェクト初期化子での末尾からのインデックス

  • イテレーターと非同期メソッドにおけるrefローカルやunsafe

  • ref structによるインターフェイス実装

  • ref structを許可するジェネリック制約

  • 部分プロパティと部分インデクサー

  • オーバーロード解決の優先順位

従来のparamsは主に配列で使用していましたが、C# 13ではSpan<T>や一定のコレクション型にも適用できます。Microsoft Learn+1

2-9. C# 14のリリース時期と主な機能

C# 14は2025年11月に.NET 10とともに正式リリースされました。

主な機能は次のとおりです。

  • 拡張メンバー

  • null条件付き代入

  • バインドされていないジェネリック型に対するnameof

  • Span<T>ReadOnlySpan<T>の暗黙的変換の拡張

  • 型を省略したラムダパラメーターへの修飾子

  • fieldでサポートされるプロパティ

  • 部分イベントと部分コンストラクター

  • ユーザー定義複合代入演算子

  • ファイルベースアプリ向けプリプロセッサディレクティブ

null条件付き代入では、nullチェックを簡潔に記述できます。

C#
customer?.Order = GetCurrentOrder();

拡張メンバーでは、従来の拡張メソッドに加えて、拡張プロパティや型に対する静的な拡張メンバーを定義できます。Microsoft Learn+2Microsoft 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 5net5.0C# 9.0
.NET 6net6.0C# 10
.NET 7net7.0C# 11
.NET 8net8.0C# 12
.NET 9net9.0C# 13
.NET 10net10.0C# 14
.NET 11 Previewnet11.0C# 15プレビュー

.NET 11とC# 15は、2026年6月時点ではプレビュー版です。正式な本番環境では、安定版である.NET 10とC# 14までを基本とします。Microsoft Learn+1

3-2. .NET CoreとC#言語バージョンの対応表

ターゲット既定のC#言語バージョン
.NET Core 3.xC# 8.0
.NET Core 2.xC# 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.1C# 8.0
.NET Standard 2.0C# 7.3
.NET Standard 1.xC# 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.1C# 7.3
.NET Framework 4.8C# 7.3
.NET Framework 4.7.xC# 7.3
その他の.NET FrameworkC# 7.3

新しいRoslynコンパイラを使用すると、一部の新しい構文をコンパイルできる場合があります。しかし、ターゲットフレームワークに関連付けられたバージョンより新しいC#言語バージョンの使用は、現在のMicrosoft公式ドキュメントではサポート対象外とされています。Microsoft Learn+1

3-5. ターゲットフレームワーク別に選択される既定のC#バージョン

代表的な対応関係をまとめると、次のようになります。

ターゲット既定のC#
.NET 11.xC# 15
.NET 10.xC# 14
.NET 9.xC# 13
.NET 8.xC# 12
.NET 7.xC# 11
.NET 6.xC# 10
.NET 5.xC# 9.0
.NET Core 3.xC# 8.0
.NET Core 2.xC# 7.3
.NET Standard 2.1C# 8.0
.NET Standard 2.0・1.xC# 7.3
.NET FrameworkC# 7.3

LangVersionを省略した場合は、この対応関係と使用中のSDKに基づいて言語バージョンが決まります。Microsoft Learn

3-6. 古い.NETで新しいC#言語バージョンを使う際の制限

新しいコンパイラが構文を認識できても、次の理由で古い.NETでは利用できないことがあります。

  • 必要な型がターゲットフレームワークに存在しない

  • CLRに必要な機能が実装されていない

  • コンパイラが必要な属性やメタデータを出力できない

  • 新しい標準ライブラリAPIを参照できない

  • 実行時にTypeLoadExceptionMissingMethodExceptionなどが発生する

  • ソースジェネレーターやアナライザーが古いコンパイラに対応していない

たとえば、既定のインターフェイス実装には.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は、次のコマンドで確認できます。

Bash
dotnet --list-sdks

現在のディレクトリで実際に選択されるSDKは、次のコマンドで確認します。

Bash
dotnet --version

OS、SDK、ランタイム、アーキテクチャなどの詳細情報は、次のコマンドで確認できます。

Bash
dotnet --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#言語バージョンを明示的に変更する場合は、csprojPropertyGroupLangVersionを追加します。

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プロパティとして渡せます。

Bash
dotnet build -p:LangVersion=13

Windows環境では、次の形式も利用できます。

Bash
dotnet build /p:LangVersion=13

C#コンパイラを直接実行する場合は、-langversionオプションを使用します。

Bash
csc -langversion:13 Program.cs

通常のSDKスタイルプロジェクトでは、cscを直接実行するより、csprojまたはdotnet buildで設定する方法が適しています。

5-6. .NET SDKとターゲットフレームワークを更新する

新しいC#を正式に使用する最も安全な方法は、次の3つをそろえて更新することです。

  1. .NET SDK

  2. ターゲットフレームワーク

  3. 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#機能を有効にする

最新のプレビュー構文を使用するには、LangVersionpreviewに設定します。

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

  • プロジェクトのTargetFramework

  • global.jsonで選択されるSDK

  • Visual 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がインストールされているか確認する

次のコマンドを実行します。

Bash
dotnet --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"
}
}

rollForwarddisableの場合、指定したSDKとの完全一致が必要です。

使用可能な新しい.NET 8 SDKへ更新を許可する場合は、次のように変更できます。

JSON
{
"sdk": {
"version": "8.0.100",
"rollForward": "latestFeature"
}
}

不要な固定であればglobal.jsonを削除する方法もあります。ただし、チームやCIでSDKを統一するために置かれている可能性があるため、削除前に運用方針を確認してください。Microsoft Learn

6-6. プロジェクトの再読み込みとキャッシュ削除を行う

設定を変更してもVisual Studioへ反映されない場合は、次の順序で確認します。

  1. プロジェクトを再読み込みする

  2. Visual Studioを再起動する

  3. binobjディレクトリを削除する

  4. ソリューションディレクトリの.vsを削除する

  5. dotnet cleanを実行する

  6. コンパイラサーバーを終了する

Bash
dotnet build-server shutdown

その後、再度ビルドします。

Bash
dotnet restore
dotnet build

キャッシュを削除しても改善しない場合は、診断ログを出力します。

Bash
dotnet build --verbosity diagnostic

ログ内のSDKパス、LangVersionTargetFrameworkを確認すると、意図しない設定の上書きを見つけやすくなります。

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が正しくてもコンパイルできない場合は、次の順序で確認します。

  1. #error versionで実際の言語バージョンを確認する

  2. dotnet --versionで選択中のSDKを確認する

  3. dotnet --list-sdksで必要なSDKがあるか確認する

  4. global.jsonを確認する

  5. Directory.Build.propsを確認する

  6. ターゲットフレームワークが機能をサポートするか確認する

  7. 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やコンパイラの違いが主な原因です。

次の情報を両方の環境で比較します。

Bash
dotnet --version
dotnet --info
dotnet --list-sdks

CI/CDでは、使用するSDKを明示的にインストールし、global.jsonでも範囲を固定すると再現性が高まります。

JSON
{
"sdk": {
"version": "10.0.100",
"rollForward": "latestFeature",
"allowPrerelease": false
}
}

LangVersion=latestpreviewを使用すると、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# 12

  • net9.0:C# 13

  • net10.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を指定せず、ターゲットフレームワークから自動選択される既定値を使用するのが安全です。明示的に変更する場合は、csprojDirectory.Build.propsを使用し、言語機能だけでなくランタイムとライブラリの対応状況も確認してください。

ビルド環境を安定させるには、global.jsonで.NET SDKを管理し、ローカル環境とCI/CD環境のバージョンをそろえることも重要です。