Dev & Code Sep 3, 2026Zu Lesezeichen hinzufügen

Microsoft bestätigt über The Register die Einführung von Union-Typen in C# im November 2026. Eine Funktion, die TypeScript, Rust, Swift und F# schon lange haben und die die Art und Weise, wie Geschäftslogik in C# modelliert wird, verändert.
Wie oft haben wir in C# diesen Code geschrieben, um einen Zustand darzustellen, der drei verschiedene Formen annehmen kann?
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; }
} Ein Objekt, bei dem drei boolesche Werte sich gegenseitig ausschließen, fünf nullable Felder, die nur in Kombination mit einem bestimmten booleschen Wert Sinn ergeben, und keine Garantie des Compilers, dass wir keinen Fall im if/else vergessen. Willkommen in der modellierung durch Konvention, die auf der Disziplin des Entwicklers beruht – also auf nicht viel.
The Register kündigt am 2. September 2026 an, dass Microsoft die Einführung von Union-Typen – auch „discriminated unions“ oder „sum types“ genannt – in C# im November 2026 bestätigt hat.
Die Idee ist einfach: Statt eines Objekts mit fünf Feldern, das „ein Erfolg, eine Wartezeit oder ein Fehler sein kann“, erklärt man dem Compiler explizit, dass der Typ einer von drei sich gegenseitig ausschließenden Fällen ist, jeweils mit seinen eigenen relevanten Feldern.
In Pseudo-C# (die finale Syntax wird noch offiziell bekannt gegeben):
public union RésultatPaiement
{
Succès(string IdTransaction);
Attente(string Raison);
Erreur(string Code, string Message);
}
// Verwendung
switch (résultat)
{
case RésultatPaiement.Succès s:
Console.WriteLine($"Transaktion {s.IdTransaction}");
break;
case RésultatPaiement.Attente a:
Console.WriteLine($"In Bearbeitung: {a.Raison}");
break;
case RésultatPaiement.Erreur e:
Console.WriteLine($"Fehler {e.Code}: {e.Message}");
break;
// Der Compiler wird fehlende Fälle melden
} Der Compiler prüft die Vollständigkeit des switch: Einen Fall zu vergessen wird zu einem Fehler, nicht zu einem Produktionsbug, der sechs Monate später gefunden wird.
F#, der funktionale Cousin von C# im gleichen .NET-Ökosystem, hat die discriminated unions schon immer – es ist eines der historischen Verkaufsargumente der Sprache. Rust hat sie zu einem Grundpfeiler seines Designs gemacht (die berühmten enum und das match). Swift ebenfalls. TypeScript hat die Union-Typen seit 2015. Kotlin hat die sealed class, die sich dem Pattern annähern. C# kam mit Verspätung – man musste sich mit abstrakten Klassenhierarchien, sealed record oder OneOf<T1,T2,T3> aus Drittbibliotheken behelfen.
Drei konkrete Folgen dieser Einführung:
OneOf und LanguageExt werden sich neu organisieren. Ein Teil dessen, was sie boten, wird nativ; der Rest (Monaden, partielle Anwendung) bleibt nützlich.|>, Standard-Immutabilität), aber die Lücke schließt sich – die Frage nach der Sprachwahl in einem .NET-Projekt stellt sich anders.Die Union-Typen in C#, das ist F#, das in C# einfließt – die redaktionelle Linie von Mads Torgersen (Lead-Designer von C#) seit einigen Versionen. Für unsere Projekte ist der unmittelbarste Nutzen die Modellierung von API-Ergebnissen (Erfolg/Fehler/Teilerfolg), von Workflow-Zuständen (Entwurf/in Prüfung/veröffentlicht) und von polymorphen Payloads (Event Sourcing, Kafka-Nachrichten).
Es ist keine Revolution – andere große Sprachen haben das seit 10 Jahren. Aber für das .NET-Unternehmens-Ökosystem, in dem C# die dominierende Sprache in der Business-Logik bleibt, ist es ein qualitativer Sprung in der Zuverlässigkeit des Typsystems. Ab November in der Preview testen.
Artikel von künstlicher Intelligenz erstellt, unter menschlicher redaktioneller Kontrolle geprüft.