C# は 11 月にユニオン型を迎え入れる — F# と Rust に近づく言語の巻き返し

Dev & コード Sep 3, 2026ブックマークに追加

C# は 11 月にユニオン型を迎え入れる — F# と Rust に近づく言語の巻き返し

MicrosoftはThe Registerを通じて、C#におけるunion型の導入を2026年11月に確認しました。TypeScript、Rust、Swift、F#が長らく採用してきた機能であり、C#におけるビジネスロジックの状態モデリングの方法を変えるものです。

具体的なケース

C#で、3つの異なる形態を取りうる状態を表現するために、何度このようなコードを書いてきたでしょうか?

public class RésultatPaiement
{
 public bool EstSuccès { get; set; }
 public string? IdTransaction { get; set; }
 public bool EstEnAttente { get; set; }
 public string? RaisonAttente { get; set; }
 public bool EstErreur { get; set; }
 public string? CodeErreur { get; set; }
 public string? MessageErreur { get; set; }
}

3つのブール値が互いに排他的で、特定のブール値と組み合わせてのみ意味を持つ5つのnullableなフィールド、そしてif/elseでケースを忘れていないかコンパイラが保証してくれないオブジェクト。ようこそ、開発者の規律に依存する慣習的なモデリングの世界へ—つまり、あまり信頼できるものではありません。

起こっていること

The Registerは2026年9月2日に、MicrosoftがC#にunion types(「discriminated unions」や「sum types」とも呼ばれる)を2026年11月に導入することを確認したと発表しました。

アイデアは単純です。5つのフィールドを持つオブジェクトが「成功、待機、またはエラーのいずれかである」と述べる代わりに、コンパイラに対してその型が互いに排他的な3つのケースのいずれかであり、それぞれに固有の関連フィールドを持つことを明示的に宣言します。

擬似的なC#(最終的な構文は公式に発表される予定)では次のようになります:

public union RésultatPaiement
{
 Succès(string IdTransaction);
 Attente(string Raison);
 Erreur(string Code, string Message);
}

// 使用例
switch (résultat)
{
 case RésultatPaiement.Succès s:
 Console.WriteLine($"取引 {s.IdTransaction}");
 break;
 case RésultatPaiement.Attente a:
 Console.WriteLine($"保留中: {a.Raison}");
 break;
 case RésultatPaiement.Erreur e:
 Console.WriteLine($"エラー {e.Code}: {e.Message}");
 break;
 // コンパイラがケースの抜けを検出
}

コンパイラはswitchの網羅性を検証します。ケースを忘れると、6ヶ月後に見つかるバグではなく、コンパイルエラーになります。

なぜこれが重要か

F#は.NETエコシステム内のC#の関数型言語の cousinであり、常にdiscriminated unionsを備えています—これは言語の歴史的なセールスポイントの一つです。Rustはその設計の柱としてdiscriminated unionsを採用しています(有名なenummatch)。Swiftも同様です。TypeScriptも2015年からunion typesを備えています。Kotlinは似たようなパターンに近いsealed classを持っています。C#は遅れをとっていました—抽象クラスの階層、sealed record、サードパーティ製ライブラリのOneOf<T1,T2,T3>などを手作業で組み立てる必要がありました。

この導入による具体的な3つの影響:

  1. ビジネスモデリングがより正直になる。 慣習的に表現していた互いに排他的な状態が型になる。コンパイラがケースの抜けを防いでくれるようになる。
  2. OneOfLanguageExtのようなライブラリは再編される。 彼らが提供していた機能の一部がネイティブになる。残り(モナド、部分適用など)は引き続き有用。
  3. C#とF#の境界がさらに曖昧になる。 F#は型推論の強化、パイプライン|>、デフォルトの不変性などの強みを維持するが、ギャップは縮まる—プロジェクトにおける言語選択の議論が変わってくる。

導入前に確認すべきこと

  • 最終的な構文:Microsoftはまだ公式な仕様を発表していません。上記の例は説明用です。
  • 相互運用性:C#のunion typesがJSONにシリアライズされる方法、Entity Frameworkでの動作、WCF/gRPCでの公開方法。これらの詳細は実際の採用を左右します。
  • 互換性:union typesはおそらくC# 14+で.NET 10と共に導入される見込み。歴史的な.NET Frameworkや.NET 8 LTSのプロジェクトは待つ必要があるでしょう。

まとめ

C#のunion typesは、Mads Torgersen(C#リードデザイナー)の方針のもと、F#の影響を受けたものです。私たちのプロジェクトにとって最も immediate な利点は、APIの結果(成功/エラー/部分的)、ワークフローの状態(下書き/レビュー中/公開)、多相的なペイロード(イベントソーシング、Kafkaメッセージ)のモデリングです。

これは革命的なものではありません—他の主要言語は10年以上前からこれを備えています。しかし、ビジネスロジックでC#が依然として支配的な.NETエコシステム企業においては、型安全性の質的な飛躍です。2026年11月のプレビュー版でぜひ試してみてください。

リソース

本記事は人工知能により作成され、人間の編集管理のもとで校閲されています。

編集部について
Your Linux server, as a desktop.
TermalOSSponsored
Ops, reimagined

Your Linux server, as a desktop.

Agentless SSH monitoring, a full remote desktop and an AI ops copilot — no agents to install, everything stays on your machine.

SSHSelf-hostedAI Ops
Get early access
この記事は役に立ちましたか?

19 人がこの記事を評価しました

いいね
K
Kaito Kuroganeシニア開発者
シニア多才な開発者、バックエンドGo + フロントエンドTS、オープンソース貢献者
シェア:
Your Linux server, as a desktop.
TermalOSSponsored
Ops, reimagined

Your Linux server, as a desktop.

Agentless SSH monitoring, a full remote desktop and an AI ops copilot — no agents to install, everything stays on your machine.

Get early access
LIVERadio Geek Kitsune
タップして再生、みんなで同じ音を
0··
// 番組表
// 全ステーション
// 楽曲を共有する →
テーマ
探索
インフォメーション