Union Types — in der Theorie auch als Discriminated Unions oder Tagged Unions bekannt — sind Typen, die genau einen aus mehreren möglichen Fällen enthalten, jeweils mit eigenen Daten. In F# (Discriminated Unions) und Sprachen wie Rust (enum), Swift (enum mit Cases) oder TypeScript (string | number) sind sie Standard. In C# selbst sind Union Types als eigenes Sprachfeature Stand 2025 noch in der Diskussions- und Vorschlagsphase im Sprachteam-Repository auf GitHub und nicht offizieller Bestandteil der Sprache.
Eingesetzt werden Union-artige Konstrukte heute in C# über Workarounds: abstrakte Basisklassen oder Interfaces mit konkreten Records pro Fall, OneOf-Bibliotheken, F#-Interop oder ein selbstgebautes Result-Muster mit zwei Typparametern für Erfolg und Fehler. Pattern Matching mit type patterns und switch expressions stellt dabei den syntaktischen Ersatz für native Union-Pattern bereit. In einer ausgeprägten DDD- oder Funktional-Style-Codebasis ist dieses Muster verbreitet, etwa für API-Antworten, Workflow-Status oder Validierungsergebnisse.
Der Einsatzzweck und das gelöste Problem ergeben sich aus dem Wunsch, ‚entweder/oder'-Datenmodelle typsicher und exhaustiv abzubilden. Statt eines bool-Flags oder Status-Enums plus optionalen Feldern (mit allen damit verbundenen Inkonsistenzmöglichkeiten) drückt eine Union direkt aus, dass ein Wert entweder eine Erfolgsantwort, ein Validierungsfehler oder ein Systemfehler ist — und der Compiler kann prüfen, dass alle Fälle behandelt wurden. Das beseitigt eine ganze Klasse subtiler Fehler in der Domänenmodellierung.
Historisch ist die Idee tief in der Tradition der ML-Sprachfamilie verankert (Standard ML, OCaml, F#) und in C# über Workarounds seit langem präsent. Mit C#14 und .NET 11 finden die Union Types endlich ihren Einzug in die Plattform. In den öffentlichen Sprachdesign-Notizen wird Union Types regelmäßig als ‚most requested missing feature' nach dem Wegfall vieler älterer Themen genannt. Das Team kommuniziert offen, dass die Komplexität in der Interaktion mit Generics, Pattern Matching, Records und Nullable Reference Types groß ist und ein durchdachter Entwurf wichtiger als ein schnelles Release sei. Dieser bewusst zurückhaltende Ansatz ist charakteristisch für die jüngere C#-Sprachentwicklung.
Bei bluehands sind Union Types schon lange Bestandteil unserer Projekte und wird über SourceGeneratoren in unserem Open-Source Projekt FunicularSwitch implementiert.