女性エンジニア応援 Advent Calendar 2025 参加者募集中です!
はじめに
C# 14(.NET 10 世代)から新たに導入された Extension members は、従来の拡張メソッドを“上位互換”にしたような機能です。
拡張メソッドは便利でしたが、「これプロパティで書けたら自然なのに…」というケースが多かったはず。Extension members は、まさにその“違和感”を解決するための仕様です。
C# 14 の新機能は公式ドキュメントでも紹介されています。1
この機能が 何を変えるのか/どんな場面で活きるのか/どう書くのか を超簡潔にまとめました。
1. Extension members で何が変わる?
まずは従来との違いを比較してみます。
| 従来 (.NET 3.5〜) | C# 14 以降 | |
|---|---|---|
| 拡張できるもの |
メソッドのみstatic string TrimEx(this string s)…
|
拡張メンバー - メソッド - プロパティ - インデクサ - static メンバーも |
従来は 必ずメソッド にせざるを得なかったため、
本来はプロパティで表現したいものまで、こう書いていました。
EnumerableExtensions.IsEmpty(list)
C# 14 では、これが次のように書けます。
list.IsEmpty
これだけでも API の“自然さ”が段違い。
2. 文法:extension ブロックでまとめて宣言する
Extension members は extension (receiver) { ... } ブロック内に宣言します。
public static class EnumerableExtensions
{
// ① インスタンス拡張
extension<T>(IEnumerable<T> source)
{
public bool IsEmpty => !source.Any();
public T this[int index] => source.Skip(index).First();
}
// ② static 拡張
extension<T>(IEnumerable<T>)
{
public static IEnumerable<T> Identity => Enumerable.Empty<T>();
public static IEnumerable<T> Combine(IEnumerable<T> a, IEnumerable<T> b)
=> a.Concat(b);
}
}
呼び出し例
if (nums.IsEmpty) { ... } // ① インスタンス拡張
var all = IEnumerable<int>.Identity; // ② static 拡張
本家クラスのメンバーと見分けがつかないほど自然に扱えるのが特徴です。
3. どんな場面で活躍するの?(従来の拡張メソッドとの比較)
Extension members の恩恵が大きいのは、
まさに、「拡張メソッドの不自然さに限界を感じていた場面」 です。
✔ 3-1. 状態チェックを“プロパティで書きたい”時
【従来】
if (EnumerableExtensions.IsEmpty(list)) ...
【Extension members】
if (list.IsEmpty) ...
自然さが段違い。
LINQ/DDD/業務ロジックでも圧倒的に読みやすい。
✔ 3-2. 外部ライブラリの“惜しい” API を改善したい時
【従来】
RetryHelper.Retry(func, times);
【Extension members】
func.Retry(times)
外部ライブラリに後付けで“綺麗な DSL”を与えられる。
✔ 3-3. DDD で ValueObject に語彙を“自然に”追加したい時
【従来】
ドメイン型を直接触れないと、ロジックが中途半端に散らばる。
【Extension members】
price.WithTax
price.IsFree
userId.IsTemporary
既存型を壊さずドメイン語彙を増やせる。
DDD / Clean Architecture の現場では特に強い。
✔ 3-4. レガシー巨大コードベースを“静かに改善”したい時
【従来】
- 拡張メソッドが乱立しやすい
- API の距離が不自然
- メンテナンスが煩雑
【Extension members】
- “元クラスのメンバー”として自然に追加できる
- 呼び出す側のコードも自然になる
安全に改善でき、後方互換も保つ。
✔ 3-5. コレクション操作の便利 API を自然に追加したい時
【従来】
Utility 関数や ExtensionMethod が散らばりがちだった。
【Extension members】
list.IsSingle
dict.TryGet(key)
list.NearestToZero
LINQ スタイルの自然な API を後付けできる。
4. 既存コードとの互換性
-
thisパラメータ式の従来拡張メソッドは そのまま使える - 旧式 + 新方式の混在も可能
- 既存ライブラリを段階的に移行可能
後方互換性はしっかり確保されています!!
5. 制限・注意点(Preview 6 時点)
| 項目 | 内容 |
|---|---|
| 対応メンバー | メソッド / プロパティ / インデクサ(イベントは検討中) |
| ジェネリック制約 | レシーバーの型引数は先頭に置く必要あり |
| static クラス拡張 |
File, Path などのstatic 型そのものの拡張は未対応
|
※正式版で広がる可能性があります。
6. 実際に触る手順(VS2026 Preview / VS2022 でも可)
■ .NET 10 SDK をインストール
■ プロジェクトにこれを追加
<LangVersion>preview</LangVersion>
■ 上ののサンプルを貼り付けてビルド
※ VS2026 Preview / VS2022 どちらでも、
「C# 14 を有効にできる .NET 10 SDK を使っているか」 が要点です。
まとめ
Extension members は、拡張メソッドが抱えていた“不自然さ”を解消し、API 設計の表現力を大きく押し上げる機能です。
- プロパティやインデクサを自然に追加できる
- DSL(業務ロジック)の質が上がる
- レガシープロジェクトを壊さず改善できる
- ValueObject に語彙を与えるのが超簡単
C# 14 の中でも特に「開発体験に直結する進化」といって良い機能だと思います。
C#関連のおすすめ記事
【Visual Studio 2026】MCPがついに標準化!NuGet MCPを有効化して動作確認してみた
【C#】ボタン重複実行はなぜ起きる? - Windowsメッセージキューの仕組みと対策
【C#】PLC通信の基本を言葉の定義から理解する - 入門から実践まで
【保存版】C#基礎100本ノック GitHub Codespacesで学ぶC#
レガシーC#コード対比集(昔こう→今こう)
-
Microsoft Docs「What's new in C# 14」
https://learn.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-14 ↩ -
InfoQ「.NET 10 Preview 3: C# 14 Extension Members, ASP.NET Core State Persistence and Other Improvements」
In C# 14, notable improvements have been made to extension members. These members now support static methods, instance properties, and static properties.
https://www.infoq.com/news/2025/04/dotnet-10-preview3/ ↩ -
Cristian Sifuentes「New Features in .NET 10 & C# 14 — The Expert’s Playbook (2025)」
.NET 10 (LTS) and C# 14 dropped today — November 11, 2025.
https://dev.to/cristiansifuentes/new-features-in-net-10-c-14-the-experts-playbook-2025-2pe5 ↩