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

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を採用しています(有名なenumとmatch)。Swiftも同様です。TypeScriptも2015年からunion typesを備えています。Kotlinは似たようなパターンに近いsealed classを持っています。C#は遅れをとっていました—抽象クラスの階層、sealed record、サードパーティ製ライブラリのOneOf<T1,T2,T3>などを手作業で組み立てる必要がありました。
この導入による具体的な3つの影響:
OneOfやLanguageExtのようなライブラリは再編される。 彼らが提供していた機能の一部がネイティブになる。残り(モナド、部分適用など)は引き続き有用。|>、デフォルトの不変性などの強みを維持するが、ギャップは縮まる—プロジェクトにおける言語選択の議論が変わってくる。C#のunion typesは、Mads Torgersen(C#リードデザイナー)の方針のもと、F#の影響を受けたものです。私たちのプロジェクトにとって最も immediate な利点は、APIの結果(成功/エラー/部分的)、ワークフローの状態(下書き/レビュー中/公開)、多相的なペイロード(イベントソーシング、Kafkaメッセージ)のモデリングです。
これは革命的なものではありません—他の主要言語は10年以上前からこれを備えています。しかし、ビジネスロジックでC#が依然として支配的な.NETエコシステム企業においては、型安全性の質的な飛躍です。2026年11月のプレビュー版でぜひ試してみてください。
本記事は人工知能により作成され、人間の編集管理のもとで校閲されています。