Microsoft released .NET 11 on November 10, 2026, at .NET Conf. The same day, .NET 8 and .NET 9 reached end of support. If you run either in production, the decision is now overdue: move to .NET 11, or to .NET 10, which remains a supported LTS release.
.NET 11 is a Standard Term Support (STS) release with two years of support. The source states that STS and LTS have the same quality and servicing policies, and only the support length differs. For most services I would pick based on how often you actually upgrade, not on a perception of quality.
C# 15 Unions Replace the object-Return Workaround
C# 15 is the default language version for projects targeting .NET 11. The headline feature is union types: a value is one of a declared set of case types, with exhaustiveness checking in switch expressions.
ProductLookup result = new Product(42, "Mechanical keyboard");
string message = result switch
{
Product product => $"Found {product.Name}",
ProductNotFound missing => $"No product with ID {missing.Id}",
};
public sealed record Product(int Id, string Name);
public sealed record ProductNotFound(int Id);
public union ProductLookup(Product, ProductNotFound);
There is no shared base class and no object return type. The compiler tells callers which outcomes they must handle. C# 15 also adds closed hierarchies, where a closed class limits direct derivation to its declaring assembly so the compiler can check patterns over it. Use unions to combine existing types and closed hierarchies where you own the inheritance tree.
Smaller additions: collection expression arguments ([with(StringComparer.OrdinalIgnoreCase), "Alice", "ALICE", "Bob"] yields a count of 2), extension indexers, and labeled break/continue. None need the preview language version.
ASP.NET Core supports unions wherever it uses System.Text.Json, and OpenAPI documents describe them with anyOf. This covers JSON bodies only, not route, query, header or form binding. If several cases share the same JSON shape, you must configure a classifier to tell them apart.
What Is Stable and What Is Still Preview
The announcement mixes shipped and experimental features. This is how I would sort them:
| Feature | Status per the source |
|---|---|
| C# 15 unions, closed hierarchies | Default for net11.0 |
| Native AOT CLI host, warm MSBuild server | On by default in the SDK |
| OpenAPI 3.2 | Default for generated documents |
| Runtime Async | Preview; opt in with <Features>runtime-async=on</Features> |
| C# memory safety work | Preview |
Blazor AI components (Microsoft.AspNetCore.Components.AI) |
Experimental, prerelease throughout .NET 11 |
| AG-UI hosting integration | Prerelease |
| EF Core SQL Server vector indexes and search | Experimental |
| dotnetup toolchain manager | Public preview |
| XAML Incremental Hot Reload (MAUI) | Preview, on by default in Debug builds |
| .NET MAUI DevFlow | Experimental |
The F# union support in System.Text.Json uses reflection. It does not support source generation, trimming or Native AOT, so check that before using it in a trimmed app.
SDK Changes You Feel Without Touching Code
The SDK now enables a Native AOT CLI host by default, so commands like help and version queries run without starting the managed CLI. The MSBuild server stays warm between invocations. Container publishing gains reproducible image digests via SOURCE_DATE_EPOCH. NuGet gains a minimum package publication age setting, which lets you wait before newly published versions become eligible. The source is explicit that this is an extra policy control, not a replacement for vulnerability checks.
For Microsoft.Testing.Platform users, dotnet test gains run-level timeouts and failure limits. These switches are not interchangeable with the VSTest options.
The SDK ships an MCP server template: dotnet new mcpserver -o MyMcpServer. It uses the official MCP C# SDK and includes a sample tool. For agents, Microsoft.Extensions.AI and Microsoft Agent Framework sit on top, as in my earlier post on the MAF harness. They are NuGet packages, so you do not need to retarget to adopt them.
Breaking Changes to Check Before Retargeting
- Minimum CPU requirements have been updated. Check your build agents and container hosts.
- EF Core 11 requires .NET 11. Check your database provider's compatibility and the EF Core 11 breaking changes.
- MAUI makes CoreCLR the default runtime, and the
Microsoft.Maui.Controls.Compatibilitypackage no longer ships. Apps that reference it must migrate. Test navigation, custom handlers and trimmed publishing. - OpenAPI 3.2 by default. If your client generator does not support it, select an earlier document version explicitly.
- Blazor circuit pause is opt-in and needs an extra package plus configuration, so upgrading will not silently change circuit behavior.
Upgrade Steps
- Update
global.jsonif it pins the SDK, and install the matching SDK on dev machines and build agents. - Change target frameworks to
net11.0, keeping platform suffixes. Installing the SDK alone does not retarget anything. - Update packages and workloads.
- Run tests and measure under a representative workload. Validate your publish mode, container base images and native dependencies.
If you are on an RC build, move to the final SDK, runtime and packages.
The source says to measure the JIT and Native AOT gains on your own workload, and I agree. Microsoft gives no single headline number, only a pointer to Stephen Toub's performance post. Treat the throughput claims as a reason to benchmark, not a promise.
Sources: