Am 14. Juli 2026 hat Microsoft .NET 11 Preview 6 veröffentlicht – und diesmal ist es keine der üblichen „ein paar Bugfixes”-Ausgaben. Preview 6 bringt die lang ersehnten Union Types in C# 15 an den Punkt, an dem man sie ernsthaft ausprobieren sollte, dazu handfeste Neuerungen in ASP.NET Core, EF Core und MAUI. Parallel liefen die Juli-Sicherheitsupdates mit 17 CVEs. Hier der geordnete Überblick – mit Codebeispielen.
Zuerst das Pflichtprogramm: Juli-Sicherheitsupdates
Bevor jemand mit der Preview experimentiert, gehört das Servicing-Update eingespielt. Zeitgleich zu Preview 6 erschienen .NET 10.0.10, .NET 9.0.18 und .NET 8.0.29. Sie schließen 17 CVEs, darunter drei kritische Remote-Code-Execution-Lücken, einheitlich über alle drei aktiven Zweige. Das betrifft Produktivsysteme unabhängig davon, ob man Preview 6 überhaupt anfasst – also nicht liegen lassen.
Das Highlight: Union Types in C# 15
Wer schon einmal ein Ergebnis modellieren musste, das „entweder Erfolg oder Fehler” ist, kennt den Schmerz: abstrakte Basisklassen mit Vererbungshierarchie, das NuGet-Paket OneOf – oder ein object mit is-Prüfungen an jeder Ecke. C# 15 macht damit Schluss und bringt echte, compilergestützte Union Types.
Eine Union deklariert eine geschlossene Menge von Fall-Typen. Diese müssen nicht miteinander verwandt sein, und es können keine weiteren Typen hinzukommen – der Compiler kennt also alle möglichen Fälle:
public record class Cat(string Name);
public record class Dog(string Name);
public record class Bird(string Name);
// Eine Union ueber drei nicht verwandte Typen
public union Pet(Cat, Dog, Bird);Die Zuweisung erfolgt über implizite Konvertierungen – kein Wrapper, kein .Match(...)-Boilerplate:
Pet pet = new Dog("Rex");
Pet pet2 = new Cat("Whiskers");Der eigentliche Gewinn zeigt sich beim Pattern Matching. Weil der Compiler die geschlossene Menge kennt, prüft er die Vollständigkeit – ein default-Zweig ist nicht nötig, und vergessene Fälle werden gemeldet:
string name = pet switch
{
Dog d => d.Name,
Cat c => c.Name,
Bird b => b.Name,
// kein default noetig - der Compiler weiss, dass alle Faelle abgedeckt sind
};Warum das mehr ist als Syntax-Zucker
Der klassische Anwendungsfall ist das Modellieren von Ergebnissen ohne Exceptions. Statt einer Ausnahme oder eines Statuscodes mit nullable Payload beschreibt die Union genau die möglichen Ausgänge:
public record class Success(User User);
public record class NotFound(int Id);
public record class ValidationError(string Message);
public union UserResult(Success, NotFound, ValidationError);
public UserResult GetUser(int id) =>
id switch
{
< 0 => new ValidationError("Id muss positiv sein"),
0 => new NotFound(0),
_ => new Success(new User(id, "Joern")),
};In Preview 6 sind die Union-Support-Typen jetzt Teil des Frameworks selbst – laut Microsoft nutzbar „ohne die üblichen Preview-Vorbehalte”. Als angenehmer Nebeneffekt serialisiert System.Text.Json Union Types direkt, und ASP.NET Core akzeptiert sie als JSON-Request- und Response-Bodies.
Praxishinweis: Die aktuelle Union-Repräsentation speichert den Wert intern als object?. Bei Value-Types (struct-Cases) kann das zu Boxing führen. Für Domänenmodelle mit Records ist das irrelevant – in heißen Pfaden mit vielen struct-Fällen sollte man Allokationen aber im Blick behalten und profilen, bevor man großflächig migriert.
Ebenfalls neu in C# 15: Extension Indexer
Neben Extension-Methoden und -Properties gibt es jetzt Extension Indexer. Man kann also einen this[...]-Zugriff für einen bestehenden Typ definieren, ohne dessen Interface anzufassen – etwa einen „from-the-end”-Index für IReadOnlyList<T>:
public static class ReadOnlyListExtensions
{
extension<T>(IReadOnlyList<T> list)
{
public T this[Index index] => list[index.GetOffset(list.Count)];
}
}
// Nutzung
IReadOnlyList<int> data = [10, 20, 30];
int last = data[^1]; // 30 - ohne dass IReadOnlyList<T> je einen Index-Indexer hatteDie wichtigsten Neuerungen im Überblick
| Bereich | Was neu ist |
|---|---|
| C# 15 | Union Types als Framework-Bestandteil, Extension Indexer, JSON-Serialisierung von Unions. |
| ASP.NET Core | OpenAPI 3.2 als Default, asynchrone Validierung für Minimal APIs, automatischer CSRF-Schutz, Union Types als JSON-Bodies, Endpoint-Short-Circuiting, SignalR-Token-Refresh. |
| Blazor | Virtualize kann gezielt zu einem Element scrollen. |
| EF Core | FullJoin → SQL FULL OUTER JOIN, List<T>.Exists → EXISTS-Subquery, Komplextyp-Properties in Keys/Indizes, Indizes auf JSON-Spalten (SQL Server). |
| .NET MAUI | CollectionView2 nun auch für Windows, handler-basierte Android-Shell, HybridWebView AOT-/Trimming-fest, Wechsel Richtung CoreCLR statt Mono. |
| Runtime | Async- und JIT-Optimierungen, schnellerer NativeAOT-Interface-Dispatch, neue SIMD-APIs, In-Process-Crash-Reporting. |
| SDK | dotnet test mit neuen Optionen (xUnit v3, NUnit), Multi-Arch-Container via Podman, kleinere Native-AOT-Images, #:include für DLLs in File-based Apps. |
ASP.NET Core: viele kleine, sehr praktische Schritte
Für ASP.NET-Entwickler liest sich Preview 6 wie eine Wunschliste. OpenAPI 3.2 wird zum Default – wer Client-Generatoren oder Doku-Tooling einsetzt, sollte prüfen, ob die Toolchain das versteht. Die asynchrone Validierung für Minimal APIs darf jetzt die Datenbank abfragen (etwa „E-Mail bereits vergeben?”), ohne den Thread zu blockieren. Dazu kommen automatischer CSRF-Schutz für Cross-Origin-Requests, Endpoint-Short-Circuiting per Attribut und SignalR-Verbesserungen wie Token-Refresh in langlebigen Verbindungen. Passend zu C# 15 lassen sich Union Types direkt als Request-/Response-Modelle nutzen – ideal für „200 mit Ergebnis oder 400 mit Fehlerobjekt”.
Der Elefant im Raum: 10. November 2026
So verlockend Preview 6 ist – der wichtigste Termin steht im Kalender, nicht im Changelog. Am 10. November 2026 erreichen .NET 8 und .NET 9 gleichzeitig ihr End-of-Support. Danach fließen keine Sicherheitsupdates mehr. Empfohlenes Ziel für Produktivsysteme ist .NET 10 LTS (Support bis 14. November 2028) mit besserer JIT-Inlining-Performance, AVX10.2 und Post-Quantum-Kryptografie.
Praxishinweis: Wer noch auf .NET 8 oder 9 sitzt, plant die Migration auf .NET 10 LTS besser jetzt als im Oktober. Der Sprung ist in aller Regel unkritisch – aber unter Zeitdruck kurz vor dem Stichtag macht ihn niemand gern.
Selbst ausprobieren
Preview 6 lässt sich risikoarm parallel zu bestehenden SDKs installieren. Nach dem Download des .NET-11-SDK (Preview 6) im Projekt die Sprachversion auf preview setzen:
<PropertyGroup>
<TargetFramework>net11.0</TargetFramework>
<LangVersion>preview</LangVersion>
</PropertyGroup>Damit Produktivbuilds nicht versehentlich das Preview-SDK ziehen, die Version per global.json pro Projekt festnageln:
{
"sdk": { "version": "11.0.100-preview.6.xxxxx" }
}Ein guter erster Test: ein bestehendes OneOf– oder Result-Pattern in eine Union überführen und sehen, wie viel Boilerplate verschwindet.
Was ich in der Praxis erwarte
Union Types sind das Feature, auf das die C#-Community über ein Jahrzehnt gewartet hat – und sie fügen sich sauber in Pattern Matching, System.Text.Json und ASP.NET Core ein. Der Reiz ist groß, sofort alles umzustellen. Mein Rat: in einem Nebenprojekt oder Branch experimentieren, die Boxing-Frage bei struct-lastigem Code im Auge behalten – und die Preview nicht mit dem Produktivziel verwechseln.
Kür und Pflicht gehören zusammen gedacht: Union Types ausprobieren ist die Kür. Die Migration weg von .NET 8/9 vor dem 10. November ist die Pflicht.
Quellen
.NET 11 Preview 6 – .NET Blog
Explore union types in C# 15 – .NET Blog
Preview 6 Roundup – Visual Studio Magazine
Juli-2026-Servicing-Updates – .NET Blog
