.NET 11 Preview 6

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 hatte

Die wichtigsten Neuerungen im Überblick

BereichWas neu ist
C# 15Union Types als Framework-Bestandteil, Extension Indexer, JSON-Serialisierung von Unions.
ASP.NET CoreOpenAPI 3.2 als Default, asynchrone Validierung für Minimal APIs, automatischer CSRF-Schutz, Union Types als JSON-Bodies, Endpoint-Short-Circuiting, SignalR-Token-Refresh.
BlazorVirtualize kann gezielt zu einem Element scrollen.
EF CoreFullJoin → SQL FULL OUTER JOIN, List<T>.Exists → EXISTS-Subquery, Komplextyp-Properties in Keys/Indizes, Indizes auf JSON-Spalten (SQL Server).
.NET MAUICollectionView2 nun auch für Windows, handler-basierte Android-Shell, HybridWebView AOT-/Trimming-fest, Wechsel Richtung CoreCLR statt Mono.
RuntimeAsync- und JIT-Optimierungen, schnellerer NativeAOT-Interface-Dispatch, neue SIMD-APIs, In-Process-Crash-Reporting.
SDKdotnet 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