C# Versions完全ガイド|最新C# 15プレビューまでの違い・対応.NET・確認方法を一覧で解説
はじめに
「c# versions」と検索する人の多くは、C#の歴代バージョンを一覧で見たい、今使っているC#バージョンを確認したい、.NETやVisual Studioとの対応関係を知りたい、という目的を持っています。
C#は単体で動く言語というより、.NET SDK、ターゲットフレームワーク、コンパイラ、IDEと密接に結び付いて進化してきた言語です。そのため、「C# 14を使いたい」「C# 15プレビューを試したい」と思っても、単にコードの書き方を変えるだけではなく、対象の.NETバージョンやSDK、開発環境も確認する必要があります。
2026年6月時点では、公式ドキュメント上の最新安定版はC# 14、最新プレビューはC# 15です。C# 14は.NET 10でサポートされ、C# 15は.NET 11プレビューSDKで試す位置づけです。C# 15には、コレクション式引数、union types、closed hierarchiesなどのプレビュー機能が含まれています。Microsoft Learn+1
1. C# versionsで検索する人が知りたいこと
1-1. C# versionsとは:C#の言語バージョンを指す検索キーワード
「C# versions」とは、C#の言語バージョン全体を調べるための検索キーワードです。C# 1.0からC# 14、さらにC# 15プレビューまで、どのバージョンでどの機能が追加されたのか、どの.NETと組み合わせて使うのかを確認したいときに使われます。
C#のバージョンは、アプリケーションの実行環境そのものではなく、主に「どの構文や言語機能をコンパイラが受け入れるか」を表します。たとえば、C# 12ではプライマリコンストラクターやコレクション式が使えますが、C# 11以前では同じ書き方がコンパイルエラーになります。Microsoft Learn
1-2. C#のバージョンと.NET・SDK・Visual Studioの違い
C#のバージョン、.NETのバージョン、.NET SDKのバージョン、Visual Studioのバージョンは別物です。
C#バージョンは言語仕様の世代を表します。.NETバージョンはランタイムや標準ライブラリの世代を表します。.NET SDKはコンパイラやCLI、ビルドツールを含む開発キットです。Visual StudioやRider、VS Codeはコードを書くための開発環境です。
実務では、この4つを分けて考えることが重要です。たとえば、プロジェクトがnet8.0をターゲットにしていれば、既定のC#バージョンはC# 12です。新しいSDKが入っていても、ターゲットフレームワークに対応しない新しいC#バージョンを使うことはサポート外になります。Microsoft Learn+1
1-3. この記事で分かること:一覧・違い・対応.NET・確認方法・変更方法
この記事では、C# versionsに関して次の内容を整理します。
| 知りたいこと | この記事での解説内容 |
|---|---|
| C#の全体像 | C# 1.0からC# 15プレビューまでの流れ |
| 最新版 | C# 14とC# 15プレビューの位置づけ |
| 対応.NET | C#バージョンとターゲットフレームワークの関係 |
| 主な違い | C# 8以降、C# 10以降、C# 14以降の重要な変化 |
| 確認方法 | dotnet --version、dotnet --list-sdks、csproj、Visual Studio |
| 変更方法 | LangVersion、Directory.Build.props、global.json |
| 実務判断 | 新規開発、既存プロジェクト、CI/CD、LTS運用での選び方 |
1-4. 先に結論:最新安定版と最新プレビューの位置づけ
先に結論をまとめると、通常の新規開発で安定性を重視するならC# 14と.NET 10が有力な選択肢です。C# 14は最新安定版で、.NET 10に対応しています。Microsoftの.NETサポートポリシーでは、偶数年リリースの.NETはLTSとして3年間サポートされる流れになっています。Microsoft Learn+1
一方、C# 15はプレビューです。C# 15の新機能を試すには.NET 11プレビューSDKやVisual Studio 2026 Insidersなどのプレビュー環境が必要です。プレビュー版は仕様が変わる可能性があるため、本番システムでは原則として慎重に扱うべきです。Microsoft Learn
2. C# Versions一覧表|リリース時期・対応.NET・主な新機能
C# versionsを理解するうえで、まず一覧表を見るのが最も早い方法です。
| C#バージョン | リリース時期・位置づけ | 既定で対応する主な.NET | 主な新機能・特徴 |
|---|---|---|---|
| C# 15 | プレビュー | .NET 11.xプレビュー | コレクション式引数、union types、closed hierarchies |
| C# 14 | 2025年11月 | .NET 10.x | 拡張メンバー、null条件付き代入、field、nameof(List<>)、Span変換 |
| C# 13 | 2024年11月 | .NET 9.x | params collections、新しいlock、\e、ref struct強化 |
| C# 12 | 2023年11月 | .NET 8.x | プライマリコンストラクター、コレクション式、インライン配列 |
| C# 11 | 2022年11月 | .NET 7.x | raw string literals、generic math、required members、list patterns |
| C# 10 | 2021年11月 | .NET 6.x | global using、file-scoped namespace、record struct |
| C# 9.0 | 2020年11月 | .NET 5.x | records、init-only setters、top-level statements |
| C# 8.0 | 2019年9月 | .NET Core 3.x | nullable reference types、async streams、switch expressions |
| C# 7.3 | 2018年5月 | .NET Core 2.xなど | safe codeの性能改善、ref関連強化 |
| C# 7.2 | 2017年11月 | .NET Core 2.xなど | readonly struct、in、ref readonly |
| C# 7.1 | 2017年8月 | .NET Core 2.xなど | async Main、default literalなど |
| C# 7.0 | 2017年3月 | .NET Framework / .NET Core時代 | tuples、pattern matching、local functions |
| C# 6.0 | 2015年7月 | .NET Framework時代 | string interpolation、nameof、null propagator |
| C# 5.0 | 2012年8月 | .NET Framework時代 | async / await |
| C# 4.0 | 2010年4月 | .NET Framework時代 | dynamic、名前付き引数、オプション引数 |
| C# 3.0 | 2007年11月 | .NET Framework 3.5時代 | LINQ、lambda、extension methods、var |
| C# 2.0 | 2005年11月 | .NET Framework 2.0時代 | generics、nullable value types、iterators |
| C# 1.0 / 1.2 | 2002年 / 2003年 | .NET Framework初期 | class、struct、interface、delegateなどの基礎 |
C# 14までの主要なリリース時期と機能は、Microsoft LearnのC# version historyで整理されています。C# 15については、現時点では「最新プレビュー」として別ページで公開されています。Microsoft Learn+3
Microsoft Learn+3
Microsoft Learn+3
2-1. C# 15プレビュー:最新プレビューの概要と注意点
C# 15は、2026年6月時点で最新のC#プレビューリリースです。公式ドキュメントでは、.NET 11プレビューSDKまたはVisual Studio 2026 Insidersを使って試す機能として案内されています。主な機能には、コレクション式引数、union types、closed hierarchiesがあります。Microsoft Learn
C# 15で特に注目されるのは、union typesです。これは、ある値が複数のケース型のいずれかであることを型として表現する仕組みです。従来は継承、インターフェース、record、パターンマッチングを組み合わせて表現していた領域を、より直接的に書けるようになる可能性があります。
ただし、C# 15はまだプレビューです。本番利用では、仕様変更、コンパイラの挙動変更、IDE対応の差、CI環境でのSDK差に注意が必要です。
2-2. C# 14:最新安定版の主な変更点
C# 14は最新の安定版です。対応する.NETは.NET 10です。主な新機能には、拡張メンバー、null条件付き代入、nameofの未バインドジェネリック型対応、Span<T>とReadOnlySpan<T>の暗黙変換強化、単純なラムダパラメーター修飾子、fieldでサポートされるプロパティ、partialイベント・コンストラクター、ユーザー定義複合代入演算子などがあります。Microsoft Learn
C# 14の特徴は、既存の書き方を大きく壊すというより、日常的なコードをより自然に、短く、安全に書ける方向へ進化している点です。特に拡張メンバーは、従来の拡張メソッドよりも自然なAPI設計を可能にします。
2-3. C# 13:.NET 9世代の主な新機能
C# 13は.NET 9世代のC#です。主な新機能には、配列以外にも使えるparams collections、System.Threading.Lockに対応した新しいlockの仕組み、ESCAPE文字を表す\eエスケープシーケンス、メソッドグループの自然型改善、オブジェクト初期化子での暗黙的インデクサーアクセス、ref struct関連の強化などがあります。Microsoft Learn
C# 13は、アプリ開発者向けの大きな構文追加というより、ライブラリ作者や高性能コードを書く開発者にとって効く改善が多いバージョンです。
2-4. C# 12:.NET 8世代の主な新機能
C# 12は.NET 8世代のC#です。プライマリコンストラクター、コレクション式、インライン配列、ラムダ式のオプションパラメーター、ref readonlyパラメーター、任意の型へのエイリアス、Experimental属性などが追加されました。Microsoft Learn
特にプライマリコンストラクターとコレクション式は、日常のコード量を減らす効果が大きい機能です。たとえばDTO、設定クラス、簡単なサービスクラスでは、コンストラクターやコレクション初期化の記述がすっきりします。
2-5. C# 11:.NET 7世代の主な新機能
C# 11は.NET 7世代のC#です。raw string literals、generic math、generic attributes、UTF-8 string literals、list patterns、file-local types、required members、auto-default structsなどが追加されました。Microsoft Learn
raw string literalsはJSON、SQL、正規表現、複数行文字列を扱うコードで便利です。required membersは、オブジェクト初期化時に必須プロパティの指定漏れを防ぎやすくします。generic mathは、数値型に依存しない汎用的な計算コードを書くうえで重要です。
2-6. C# 10:.NET 6世代の主な新機能
C# 10は.NET 6世代のC#です。record struct、global using directives、file-scoped namespace、拡張プロパティパターン、ラムダ式の自然型、ラムダ式への属性、CallerArgumentExpressionなどが追加されました。Microsoft Learn
C# 10以降のコードでは、namespace MyApp;のようなfile-scoped namespaceや、global usingにより、従来よりもファイル冒頭の定型コードが少なくなります。古いC#に慣れている人がC# 10以降のコードを読むと、Program.csが極端に短く見えることがあります。
2-7. C# 9.0:.NET 5世代の主な新機能
C# 9.0は.NET 5世代のC#です。records、init-only setters、top-level statements、パターンマッチングの強化、target-typed new、関数ポインター、module initializersなどが追加されました。Microsoft Learn+1
recordsとinit-only settersは、イミュータブルなデータ表現を簡潔に書くための重要機能です。top-level statementsは、コンソールアプリやサンプルコードでclass Programやstatic void Mainを省略できるため、初心者向けのコードにも大きな影響を与えました。
2-8. C# 8.0:.NET Core 3.x世代の主な新機能
C# 8.0は.NET Coreを強く意識した最初の大きなC#リリースです。nullable reference types、default interface members、switch expressions、property patterns、using declarations、static local functions、async streams、indices and ranges、null-coalescing assignmentなどが追加されました。Microsoft Learn
なかでもnullable reference typesは、C#の設計思想に大きな影響を与えました。stringとstring?を区別することで、null参照例外をコンパイル時に見つけやすくなります。ただし、既存コードに後から導入する場合は警告が大量に出ることがあるため、段階的な移行が現実的です。
2-9. C# 7.x:C# 7.0〜7.3の主な新機能
C# 7.xは、C# 7.0、7.1、7.2、7.3の小刻みなリリースで構成されます。C# 7.0では、out variables、tuples、deconstruction、pattern matching、local functions、ref locals、ref returns、discards、binary literals、throw expressionsなどが追加されました。Microsoft Learn
C# 7.2ではreadonly struct、inパラメーター、ref readonly戻り値、ref structなどが追加され、C# 7.3ではsafe codeをより高速にするための改善やタプル比較の改善などが入りました。Microsoft Learn
C# 7.xは、古い.NET Framework系のコードでも比較的よく見かけるバージョンです。既存業務システムを読む場合、tuples、pattern matching、local functionsあたりは必ず押さえておくと理解しやすくなります。
2-10. C# 6以前:C# 1.0〜6.0の進化ポイント
C# 6.0では、static imports、exception filters、auto-property initializers、expression-bodied members、null propagator、string interpolation、nameofなどが追加されました。Microsoft Learn
C# 5.0ではasync / awaitが導入され、非同期プログラミングがC#の中心的な書き方の一つになりました。C# 4.0ではdynamic、名前付き引数、オプション引数が入り、COM連携や動的な処理が書きやすくなりました。C# 3.0ではLINQ、ラムダ式、拡張メソッド、varが入り、C#の表現力が大きく変わりました。C# 2.0ではジェネリック、nullable value types、iteratorsが追加され、型安全で再利用性の高いコードが書きやすくなりました。Microsoft Learn+1
3. C#バージョンと対応.NETの関係
3-1. C#の言語バージョンは.NET SDKによって決まる
C#のコンパイラは.NET SDKに含まれています。つまり、どのC#構文を使えるかは、インストールされているSDK、プロジェクトのターゲットフレームワーク、LangVersion設定によって決まります。
基本的には、プロジェクトのTargetFrameworkに対応するC#バージョンが既定で選ばれます。たとえば、net10.0ならC# 14、net9.0ならC# 13、net8.0ならC# 12が既定です。Microsoft Learn
3-2. Target Framework MonikerとC#バージョンの対応関係
Target Framework Moniker、略してTFMは、プロジェクトがどの.NETを対象にするかを示す値です。csprojでは次のように書かれます。
XML<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>
主な対応関係は次の通りです。
| Target Framework | 既定の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 | C# 7.3 |
| .NET Framework | C# 7.3 |
この表は、C# versionsを調べるときに最も重要です。なぜなら、単に「C# 14を使いたい」と考えるのではなく、「プロジェクトのTFMがC# 14をサポートするか」を見る必要があるからです。Microsoft Learn
3-3. 新しいC#を古い.NETで使えない理由
新しいC#機能の中には、コンパイラだけで完結するものもありますが、ランタイムや標準ライブラリの新しい型・メソッドに依存するものもあります。
たとえば、C# 8.0のdefault interface membersはCLR側の機能強化を必要とし、indices and rangesやasync streamsも.NET Core 3.0世代のライブラリ型に依存します。Microsoft Learn
そのため、古い.NET Frameworkに新しいC#構文だけを無理に持ち込むと、コンパイルできても実行時やライブラリ互換性で問題が起きる可能性があります。
3-4. langversionを指定してもサポート外になるケース
LangVersionで新しいC#バージョンを指定すると、コンパイラが新しい構文を受け入れるように見える場合があります。しかし、ターゲットTFMに関連付けられたC#バージョンより新しい言語バージョンを使うことは、公式にはサポートされていません。Microsoft Learn
たとえば、net8.0のプロジェクトで<LangVersion>14.0</LangVersion>を指定してC# 14構文を使う、といった運用は避けるべきです。SDKやコンパイラの組み合わせによって一部は動く可能性がありますが、長期保守性やチーム開発の再現性を損ないます。
3-5. LTS版.NETを使う場合のC#バージョン選び
業務システムや長期運用のWebアプリでは、LTS版.NETを選ぶことが多くなります。Microsoftのサポートポリシーでは、LTSリリースは3年間サポートされ、STSリリースは2年間サポートされます。Microsoft
LTSを重視するなら、.NET 10 + C# 14、または既存環境によっては.NET 8 + C# 12が現実的です。最新プレビューのC# 15は検証用途に向いていますが、長期運用の本番基盤としては正式リリースを待つ判断が安全です。
4. C# 15プレビューの新機能と注意点
4-1. C# 15プレビューで追加される主な機能
C# 15プレビューで公開されている主な新機能は、コレクション式引数、union types、closed hierarchiesです。Microsoft Learn
コレクション式引数は、コレクション式の中でコンストラクターやファクトリに渡す引数を表現できる機能です。たとえば、容量や比較器のような情報をコレクション生成時に指定しやすくなります。
union typesは、値が複数の型のいずれかであることを明示的に表す機能です。従来は抽象基底クラス、インターフェース、record、パターンマッチングで表現していた設計を、言語機能としてより直接的に表せる可能性があります。
closed hierarchiesは、継承階層を一定範囲に閉じることで、パターンマッチングやドメインモデル設計を安全にしやすくする機能です。派生型の範囲が制御されるため、「この状態の種類はこれだけ」といったモデリングに向いています。
4-2. プレビュー版を試すために必要な.NET SDKと開発環境
C# 15を試すには、.NET 11プレビューSDKが必要です。公式ドキュメントでは、最新のVisual Studio 2026 Insidersまたは.NET 11 preview SDKを使うよう案内されています。Microsoft Learn
csprojでは次のように設定します。
XML<PropertyGroup>
<TargetFramework>net11.0</TargetFramework>
<LangVersion>preview</LangVersion>
</PropertyGroup>
ただし、プレビューSDKを入れる場合は、既存プロジェクトに影響しないようにglobal.jsonでSDKを固定することをおすすめします。
JSON{
"sdk": {
"version": "11.0.100-preview.5.XXXXX",
"allowPrerelease": true
}
}
実際のSDKバージョンは、インストールしたプレビューSDKに合わせて指定します。
4-3. 本番利用前に確認すべき互換性と破壊的変更
プレビュー版を使う前に、破壊的変更の有無を確認する必要があります。C# 15では、C# 14以降のコンパイラ破壊的変更として、withという名前のメソッドとコレクション式引数の解釈に関する変更例が公式に示されています。Microsoft Learn
本番導入前には、少なくとも次を確認しましょう。
| 確認項目 | 内容 |
|---|---|
| SDK | 開発者全員とCIで同じSDKを使っているか |
| IDE | Visual Studio、Rider、VS Code拡張がプレビュー構文に対応しているか |
| NuGet | 依存パッケージが対象TFMに対応しているか |
| Analyzer | StyleCop、Roslyn Analyzer、Sonarなどが新構文を解釈できるか |
| CI/CD | ビルドエージェントにプレビューSDKが入っているか |
| テスト | 単体テスト、統合テスト、リグレッションテストが通るか |
4-4. C# 15プレビューを試すべき人・待つべき人
C# 15プレビューを試すべき人は、言語機能の検証をしたい人、ライブラリ作者、将来の設計に備えたいアーキテクト、社内標準を早めに検討したいチームです。
一方、待つべき人は、安定性を最優先する業務システムの開発者、長期保守中のプロジェクト、SDK更新が難しい組織、CI/CDやIDE環境の統一が難しいチームです。
学習目的ならC# 15を触る価値はあります。しかし、実務の標準バージョンとして採用するなら、正式リリースとIDE・SDK・パッケージの成熟を待つのが無難です。
4-5. C# 14以前との違いを比較
C# 14以前は、日常的な書き方の改善やAPI設計の柔軟性向上が中心でした。C# 15プレビューでは、union typesやclosed hierarchiesのように、型設計そのものに影響する機能が目立ちます。
| 比較項目 | C# 14 | C# 15プレビュー |
|---|---|---|
| 位置づけ | 最新安定版 | 最新プレビュー |
| 対応.NET | .NET 10 | .NET 11プレビュー |
| 主な方向性 | 既存構文の改善、拡張メンバー、Span強化 | 型モデリング、union、閉じた継承階層 |
| 本番利用 | 推奨しやすい | 慎重に検証すべき |
| チーム導入 | 比較的導入しやすい | SDK・IDE統一が必須 |
5. 主要バージョン別の違いを分かりやすく比較
5-1. C# 14とC# 15プレビューの違い
C# 14とC# 15プレビューの最大の違いは、安定版かプレビューかです。C# 14は.NET 10で正式に使える最新リリースです。C# 15は.NET 11プレビューSDKで試す次世代機能です。Microsoft Learn+1
C# 14では、拡張メンバーやnull条件付き代入、fieldキーワードなど、既存コードの表現を改善する機能が多く含まれます。一方、C# 15ではunion typesやclosed hierarchiesのように、ドメインモデルや型設計に関わる機能が入っています。
5-2. C# 13とC# 14の違い
C# 13は、params collectionsや新しいlockなど、ライブラリ設計や低レイヤー寄りの改善が目立つバージョンです。C# 14は、拡張メンバー、null条件付き代入、fieldでサポートされるプロパティなど、より日常的なコードにも効く改善が増えています。Microsoft Learn+1
たとえば、C# 14では次のようなnull条件付き代入が可能です。
C#customer?.Order = GetCurrentOrder();
C# 14以前では、代入前に明示的なnullチェックが必要でした。
5-3. C# 12とC# 13の違い
C# 12は、プライマリコンストラクターとコレクション式により、コードの見た目を大きく変えました。C# 13は、それに比べると構文の見た目の変化は控えめですが、paramsの対象拡大、lockの改善、ref struct関連の強化など、性能やライブラリ表現力に関わる改善が多いです。Microsoft Learn+1
アプリ開発者にとっての体感変化はC# 12の方が大きく、ライブラリ開発者や基盤開発者にとってはC# 13の価値が大きいと考えると分かりやすいです。
5-4. C# 10以降で大きく変わった書き方
C# 10以降では、プロジェクトテンプレートやサンプルコードの見た目が大きく変わりました。
C#Console.WriteLine("Hello, World!");
このようなtop-level statementsはC# 9で入り、C# 10ではglobal usingやfile-scoped namespaceが加わったことで、さらに定型コードが少なくなりました。Microsoft Learn+1
従来のC#では、次のような構造が当たり前でした。
C#using System;
namespace Sample
{
class Program
{
static void Main()
{
Console.WriteLine("Hello, World!");
}
}
}
新しいC#では、学習用コードや小さなアプリでは非常に短く書けます。ただし、大規模開発では、読みやすさやチーム規約に応じて従来型の構造を採用することもあります。
5-5. 古いC#コードを読むときに知っておきたい違い
古いC#コードを読むときは、どのバージョンの機能が使われていないかを意識すると理解しやすくなります。
| 古いコードで見かける特徴 | 新しいC#での書き方 |
|---|---|
class Programとstatic void Mainが必ずある | top-level statementsで省略可能 |
| nullチェックが多い | nullable reference typesやパターンで補助 |
| DTOに大量のプロパティとコンストラクター | recordsやprimary constructorsを利用可能 |
| namespaceの波括弧が深い | file-scoped namespaceで浅くできる |
Tuple<T1,T2>を使う | value tupleやdeconstructionを使える |
| switch文が長い | switch expressionやpattern matchingを使える |
古いコードが悪いわけではありません。業務システムでは、対象.NETや互換性の都合で古いC#に留める判断もあります。重要なのは、どのバージョンの前提で書かれているコードなのかを把握することです。
5-6. 初心者が最初に覚えるべきバージョン差分
初心者が最初からすべてのC# versionsを覚える必要はありません。まずは次の流れを押さえれば十分です。
| 優先度 | 覚える内容 |
|---|---|
| 高 | C# 10以降の短いProgram.cs、global using、file-scoped namespace |
| 高 | C# 8のnullable reference types |
| 高 | C# 9のrecords、init、top-level statements |
| 中 | C# 12のprimary constructors、collection expressions |
| 中 | C# 7のtuples、pattern matching |
| 低 | C# 1〜6の歴史的な細かい差分 |
学習を始めるなら、現在のLTSまたは最新安定版の.NETを使い、既定のC#バージョンで学ぶのが最も自然です。
6. 自分のC#バージョンを確認する方法
6-1. dotnet --versionで.NET SDKを確認する
C#バージョンを直接表示するコマンドは、通常の.NET CLIにはありません。まずは、使われている.NET SDKを確認します。
Bashdotnet --version
このコマンドは、dotnetコマンドで使用される.NET SDKのバージョンを表示します。global.jsonがある場合、その影響を受けることがあります。Microsoft Learn
たとえば、次のように表示された場合です。
Bash10.0.100
この環境では.NET 10 SDKが使われているため、net10.0プロジェクトなら既定でC# 14を使うと判断できます。
6-2. dotnet --list-sdksでインストール済みSDKを確認する
複数のSDKが入っているか確認するには、次のコマンドを使います。
Bashdotnet --list-sdks
.NET CLIには、インストール済みSDKを一覧表示するためのdotnet --list-sdksがあります。Microsoft Learn
例です。
Bash8.0.407 [C:\Program Files\dotnet\sdk]
9.0.302 [C:\Program Files\dotnet\sdk]
10.0.100 [C:\Program Files\dotnet\sdk]
複数のSDKが入っている場合、どれが使われるかはglobal.jsonや.NET SDKの選択ルールに影響されます。
6-3. csprojファイルでTargetFrameworkを確認する
最も重要なのは、プロジェクトのcsprojにあるTargetFrameworkです。
XML<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
この場合、既定のC#バージョンはC# 12です。net10.0ならC# 14、net9.0ならC# 13です。Microsoft Learn
複数ターゲットの場合は、次のように書かれます。
XML<PropertyGroup>
<TargetFrameworks>netstandard2.0;net8.0;net10.0</TargetFrameworks>
</PropertyGroup>
この場合、ターゲットごとに使えるAPIやC#機能の制約が異なるため、最も古いターゲットに合わせた設計が必要になることがあります。
6-4. Visual StudioでC#言語バージョンを確認する
Visual Studioでは、プロジェクトプロパティのビルド設定から言語バージョンを確認できます。公式ドキュメントでは、プロジェクトプロパティページのBuildタブ内のAdvancedページで選択中のバージョンを確認できると説明されています。Microsoft Learn
ただし、Visual Studioでは、既定の言語バージョンがTFMに合わせて調整されるため、UIで言語バージョンを変更する選択肢は無効になる場合があります。言語バージョンを変えたい場合は、基本的にターゲットフレームワークを変えるのが推奨されます。Microsoft Learn
6-5. ビルドログやコンパイラエラーから確認する方法
現在のC#言語バージョンをコンパイラに表示させる方法として、コードに次の行を一時的に追加する方法があります。
C##error version
このプラグマを入れると、コンパイラバージョンと現在選択されている言語バージョンを含むエラーが出ます。公式ドキュメントでも、現在使用している言語バージョンを確認する方法として紹介されています。Microsoft Learn
確認後は、必ずこの行を削除してください。
6-6. 複数プロジェクトでバージョンが違う場合の見分け方
ソリューション内に複数プロジェクトがある場合、それぞれのcsprojを確認します。
Bashsrc/App/App.csproj
src/Domain/Domain.csproj
src/Infrastructure/Infrastructure.csproj
tests/App.Tests/App.Tests.csproj
それぞれのTargetFrameworkやLangVersionが違うと、同じソリューション内でも使えるC#構文が変わることがあります。特に、アプリ本体がnet10.0、共通ライブラリがnetstandard2.0のような構成では注意が必要です。
7. C#の言語バージョンを変更・指定する方法
7-1. csprojでLangVersionを指定する
C#の言語バージョンを明示的に指定するには、csprojにLangVersionを追加します。
XML<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<LangVersion>14.0</LangVersion>
</PropertyGroup>
プレビュー機能を試す場合は、次のように指定します。
XML<PropertyGroup>
<TargetFramework>net11.0</TargetFramework>
<LangVersion>preview</LangVersion>
</PropertyGroup>
公式ドキュメントでも、プレビュー機能にアクセスする例として<LangVersion>preview</LangVersion>が示されています。Microsoft Learn
7-2. latest・preview・default指定の違い
LangVersionには、数値だけでなく文字列も指定できます。
| 指定値 | 意味 |
|---|---|
preview | 最新プレビュー版の有効な構文を受け入れる |
latest | コンパイラの最新リリース版構文を受け入れる |
latestMajor | 最新メジャーリリース版を受け入れる |
default | 既定のメジャーバージョンを受け入れる |
14.0 | C# 14以下の構文のみ受け入れる |
13.0 | C# 13以下の構文のみ受け入れる |
12.0 | C# 12以下の構文のみ受け入れる |
latestは便利に見えますが、公式ドキュメントでは推奨されていません。理由は、インストールされているコンパイラによって使われる言語バージョンが変わり、マシン間でビルド結果が不安定になる可能性があるためです。Microsoft Learn
7-3. Directory.Build.propsで複数プロジェクトに一括設定する
複数プロジェクトで同じLangVersionを使いたい場合は、ソリューションルートにDirectory.Build.propsを置きます。
XML<Project>
<PropertyGroup>
<LangVersion>14.0</LangVersion>
</PropertyGroup>
</Project>
このファイルがあるディレクトリ配下のプロジェクトに設定が適用されます。公式ドキュメントでも、複数プロジェクトの言語バージョン設定方法としてDirectory.Build.propsが紹介されています。Microsoft Learn
ただし、C#とVisual Basicのプロジェクトが混在しているディレクトリで安易に設定すると、言語ごとのバージョンが一致せず問題になる場合があります。
7-4. Visual Studioから変更する方法
Visual Studioでは、基本的にターゲットフレームワークを変更することでC#言語バージョンが変わります。たとえば、net8.0からnet10.0に変更すれば、既定のC#バージョンはC# 12からC# 14に変わります。Microsoft Learn
明示的にLangVersionを指定したい場合は、csprojを直接編集するのが確実です。
7-5. バージョン指定で発生しやすいエラーと対処法
C#バージョン指定でよくあるエラーは次の通りです。
| エラー・症状 | 原因 | 対処法 |
|---|---|---|
| 新構文がコンパイルエラーになる | TFMが古い、SDKが古い | TargetFrameworkとSDKを確認する |
| 自分のPCでは通るがCIで落ちる | CIのSDKが古い | global.jsonでSDK固定、CIにSDK導入 |
LangVersionを上げても動かない | 対象TFMがサポート外 | TFM自体を上げる |
| IDEが赤線を出す | IDEが新構文に未対応 | IDE・拡張機能を更新 |
| NuGet復元で失敗する | パッケージが新TFM未対応 | パッケージ更新またはターゲット見直し |
7-6. LangVersionを明示指定すべきケース・しない方がよいケース
LangVersionを明示指定すべきケースは、チーム内でビルドの再現性を高めたい場合、プレビュー機能を検証したい場合、移行期間中に一時的に特定バージョンへ固定したい場合です。
一方、通常の新規開発では、LangVersionを明示せず、TargetFrameworkに応じた既定値を使う方が自然です。Microsoftのドキュメントでも、既定構成は言語機能とランタイムサポートの互換性を保証するためにTFMに合わせて調整されると説明されています。Microsoft Learn
8. C#バージョン選びの実務ガイド
8-1. 新規開発ではどのC#バージョンを選ぶべきか
新規開発では、基本的に最新の安定版.NETに対応するC#を選ぶのがおすすめです。2026年6月時点では、安定性と新機能のバランスを考えると、.NET 10 + C# 14が第一候補になります。
ただし、組織の標準が.NET 8 LTSで止まっている場合は、C# 12を使う判断も十分現実的です。重要なのは「最新だから良い」ではなく、「サポート期間、運用環境、開発者の習熟度、依存ライブラリの対応状況」を含めて決めることです。
8-2. 既存プロジェクトではどこまで上げるべきか
既存プロジェクトでは、一気に最新へ上げるより、段階的に上げる方が安全です。
たとえば、.NET 6 + C# 10のプロジェクトなら、まず.NET 8 + C# 12へ上げ、テストと依存関係を整理してから.NET 10 + C# 14を検討する流れが現実的です。
特に、nullable reference types、records、primary constructors、collection expressionsなどはコードスタイルに影響します。構文を使えるようにするだけでなく、チームのコーディング規約も更新しましょう。
8-3. 業務システム・Webアプリ・ライブラリ開発での選び方
用途別に見ると、選び方は少し変わります。
| 用途 | おすすめ方針 |
|---|---|
| 業務システム | LTS版.NETを優先し、安定版C#を使う |
| Webアプリ | 最新LTSまたは最新安定版を採用しやすい |
| 社内ツール | 最新安定版を積極採用しやすい |
| OSSライブラリ | 対応範囲を広げるためmulti-targetを検討 |
| Unity | 通常の.NETとは別にUnityの対応C#バージョンを確認 |
| 研究・検証 | C# 15プレビューを試す価値がある |
Unityは通常の.NET SDKプロジェクトとは扱いが異なります。Unity 6系の公式マニュアルでは、C#言語バージョンはC# 9.0とされ、一部のC# 9機能には未対応項目があります。Unity Manual
8-4. チーム開発でC#バージョンを統一する方法
チーム開発では、次の3点を統一します。
| 統一対象 | 方法 |
|---|---|
| TFM | csprojのTargetFrameworkを統一 |
| C#バージョン | 原則既定値、必要ならLangVersion |
| SDK | global.jsonで固定 |
さらに、READMEや開発環境セットアップ手順に、必要な.NET SDK、Visual StudioまたはRiderのバージョン、ビルド方法を書いておくと、新規参加者が迷いにくくなります。
8-5. CI/CD環境でSDKバージョンを固定する方法
CI/CDでは、開発者PCと同じSDKを使うことが重要です。GitHub Actionsならactions/setup-dotnet、Azure PipelinesならUseDotNetタスクなどを使ってSDKを指定します。
例です。
YAML- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '10.0.x'
- name: Build
run: dotnet build --configuration Release
SDKがずれると、ローカルでは通るのにCIで落ちる、またはCIでは通るのに別の開発者のPCで落ちる、といった問題が起きます。
8-6. global.jsonで.NET SDKを固定する方法
global.jsonは、.NET CLIコマンドで使うSDKバージョンを指定するファイルです。公式ドキュメントでも、global.jsonは.NET CLIコマンド実行時に使用される.NET SDKバージョンを定義できると説明されています。Microsoft Learn
例です。
JSON{
"sdk": {
"version": "10.0.100",
"rollForward": "latestFeature"
}
}
SDKバージョンは10.0のような省略形ではなく、10.0.100のような完全なバージョン番号が必要です。Microsoft Learn
9. C#バージョンアップ時の移行ポイント
9-1. バージョンアップ前に確認する項目
C#バージョンアップ前には、次の項目を確認しましょう。
| 確認項目 | 内容 |
|---|---|
| 現在のSDK | dotnet --version、dotnet --list-sdks |
| 現在のTFM | csprojのTargetFramework |
| 現在のC# | 既定値またはLangVersion |
| IDE | 新しいSDK・構文に対応しているか |
| NuGet | 対象TFMをサポートしているか |
| CI/CD | ビルドエージェントにSDKがあるか |
| テスト | 自動テストが十分か |
| Analyzer | 新構文に対応しているか |
9-2. 破壊的変更と互換性の確認方法
C#や.NETを上げるときは、コンパイラ破壊的変更、ランタイム破壊的変更、ライブラリ破壊的変更を分けて確認します。
C# 14やC# 15のような新しいバージョンでは、公式のbreaking changesドキュメントを確認するのが基本です。特にプレビュー版では、仕様やコンパイラ挙動が変わる可能性があります。Microsoft Learn
9-3. NuGetパッケージとの互換性チェック
NuGetパッケージは、対象TFMに対応していなければ使えません。たとえば、古いパッケージがnetstandard2.0やnet472までしか対応していない場合、最新の.NETでも動く可能性はありますが、警告や制限が出ることがあります。
ライブラリ開発では、利用者の範囲を広げるためにnetstandard2.0とnet10.0をmulti-targetにする選択肢があります。ただし、新しいC#機能や.NET APIを使いたい場合は、ターゲットごとの条件分岐が必要になることがあります。
9-4. Visual Studio・Rider・VS Codeの対応状況を確認する
新しいC#構文を使うには、IDE側の対応も重要です。コンパイラではビルドできても、IDEの補完、解析、フォーマット、リファクタリングが追いついていないと開発体験が悪くなります。
特にC# 15プレビューのような新機能を試す場合は、Visual Studio 2026 Insidersや最新のC# Dev Kit、RiderのEAP版など、プレビュー対応環境を確認しましょう。
9-5. 段階的にアップグレードする手順
おすすめの手順は次の通りです。
| 手順 | 内容 |
|---|---|
| 1 | 現在のSDK、TFM、C#バージョンを確認 |
| 2 | ブランチを切る |
| 3 | SDKをインストール |
| 4 | global.jsonを更新 |
| 5 | csprojのTargetFrameworkを更新 |
| 6 | dotnet restore、dotnet buildを実行 |
| 7 | 警告・エラーを修正 |
| 8 | テストを実行 |
| 9 | Analyzerとformatterを更新 |
| 10 | CI/CD設定を更新 |
| 11 | チームのコーディング規約を更新 |
一度に構文まで大きく書き換えるとレビューが難しくなります。まずはTFMとSDKを上げてテストを通し、その後にC#新機能を段階的に取り入れるのが安全です。
9-6. バージョンアップ後にテストすべきポイント
バージョンアップ後は、単にビルドが通るだけでは不十分です。次の観点でテストします。
| テスト観点 | 確認内容 |
|---|---|
| 単体テスト | 既存ロジックが壊れていないか |
| 統合テスト | DB、外部API、認証が動くか |
| パフォーマンス | レスポンス時間やメモリ使用量に変化がないか |
| デプロイ | Docker、クラウド、オンプレ環境で動くか |
| ログ | 例外や警告が増えていないか |
| シリアライズ | JSON、XML、MessagePackなどの互換性 |
| Nullable | null関連警告の扱い |
| Analyzer | 新しい構文で不要な警告が出ないか |
10. C# Versionsに関するよくある質問
10-1. C#の最新バージョンは何ですか?
2026年6月時点で、最新の安定版はC# 14です。最新プレビューはC# 15です。C# 14は.NET 10でサポートされ、C# 15は.NET 11プレビューSDKで試す位置づけです。Microsoft Learn+1
10-2. C# 15は正式版ですか?プレビューですか?
C# 15はプレビューです。公式ドキュメントでも、C# 15は最新のC# preview releaseであり、.NET 11 preview versionsがC# 15をサポートすると説明されています。Microsoft Learn
10-3. C#バージョンと.NETバージョンは同じですか?
同じではありません。C#バージョンは言語仕様、.NETバージョンはランタイムやライブラリ、SDKの世代を表します。ただし、C#の既定バージョンはターゲット.NETに強く結び付いています。たとえば、.NET 10.xの既定C#バージョンはC# 14です。Microsoft Learn
10-4. 古い.NET Frameworkで新しいC#は使えますか?
原則として、.NET Frameworkの既定C#バージョンはC# 7.3です。ターゲットTFMに関連付けられているバージョンより新しいC#言語バージョンの使用はサポートされていません。Microsoft Learn+1
一部の構文はコンパイラ設定で使える場合がありますが、公式サポート、ランタイム依存、ライブラリ依存を考えると、業務システムでは避けるのが安全です。
10-5. C#のバージョンを下げることはできますか?
できます。csprojでLangVersionを指定すれば、受け入れる構文を古いC#に制限できます。
XML<PropertyGroup>
<LangVersion>10.0</LangVersion>
</PropertyGroup>
ただし、既に新しい構文を使っているコードはコンパイルエラーになります。また、下げる理由が互換性維持なら、対象TFMや依存パッケージもあわせて見直す必要があります。
10-6. latestやpreviewを指定してもよいですか?
previewは、プレビュー機能を明示的に試す場合に使います。一方、latestは推奨されません。公式ドキュメントでは、latestはマシン間で結果が変わりビルドの信頼性を下げる可能性があるため、設定しないよう警告されています。Microsoft Learn
チーム開発では、latestよりも具体的なバージョン、またはTFMに基づく既定値を使う方が安全です。
10-7. Unityで使えるC#バージョンは通常の.NETと同じですか?
同じではありません。Unityは独自のランタイム、コンパイラ設定、API互換レベルを持つため、通常の.NET SDKプロジェクトと同じ感覚でC# 14やC# 15を使えるわけではありません。
Unity 6系の公式ドキュメントでは、C#言語バージョンはC# 9.0とされ、C# 9の一部機能にも未対応項目があります。また、UnityのAPI互換レベルには.NET Standard 2.1や.NET Framework相当の選択肢があります。Unity Manual+1
Unity開発では、「C# versions」よりも、使用しているUnity Editorのバージョンに対応するC#機能一覧を確認するのが確実です。
10-8. 学習するならどのC#バージョンから始めるべきですか?
これから学習するなら、最新安定版のC#から始めるのがおすすめです。2026年6月時点では、C# 14と.NET 10を使えば、現代的なC#の書き方を学べます。
ただし、業務で.NET 8や.NET 6を使っているなら、その環境に合わせてC# 12やC# 10を学ぶのも良い選択です。初心者は、まずC# 10以降の短いProgram.cs、nullable reference types、records、pattern matching、LINQ、async/awaitを押さえると、現場のコードを読みやすくなります。
まとめ
C# versionsを理解するポイントは、C#の言語バージョンだけを単独で見ないことです。C#は、.NET SDK、Target Framework Moniker、Visual Studioなどの開発環境と密接に関係しています。
2026年6月時点では、最新安定版はC# 14、最新プレビューはC# 15です。C# 14は.NET 10でサポートされ、拡張メンバー、null条件付き代入、fieldプロパティ、Span関連の改善などが使えます。C# 15プレビューは.NET 11プレビューSDKで試す機能で、union typesやclosed hierarchiesなど、型設計に大きく関わる新機能が含まれます。Microsoft Learn+1
実務でC#バージョンを選ぶなら、基本はターゲット.NETに合わせた既定値を使いましょう。新規開発では最新安定版、長期運用ではLTS、検証用途ではプレビューを選ぶのが分かりやすい基準です。
C#バージョンを確認するときは、dotnet --version、dotnet --list-sdks、csprojのTargetFramework、必要に応じて#error versionを使います。変更するときは、まずTFMを見直し、必要な場合だけLangVersionやDirectory.Build.propsを使います。
C# versionsの一覧を暗記する必要はありません。重要なのは、どの.NETでどのC#が既定になるのか、どの機能がどの世代で入ったのか、そして自分のプロジェクトで安全に使えるのはどこまでかを判断できるようにすることです。

