.NET 11 landed on November 10, and the headline is C# 15 union types — but the real story shipping alongside it is that .NET 8 and .NET 9 both lost patch support the same day. If either version is running in your production environment, you are now on an unsupported runtime. The upgrade decision is not academic anymore.
STS, Not LTS — What That Means for Your Team
Every even-numbered .NET release is Long-Term Support (LTS, three years). Every odd-numbered one is Standard Term Support (STS, two years). .NET 11 is the odd release. That means it expires in November 2028 — roughly five days before .NET 10 LTS does.
Read that again: upgrading from .NET 8 or .NET 9 directly to .NET 11 gives you less remaining support than upgrading to .NET 10 LTS, which shipped last month. For most teams, .NET 10 is the right upgrade target. It is LTS, the migration is straightforward, and you get real performance gains without committing to another upgrade cycle in two years. .NET 11 makes sense for greenfield projects, teams that need C# 15 union types right now, or shops that are comfortable riding the STS train.
C# 15 Union Types: Finally
Union types are the feature C# developers have been requesting for years. C# 15 delivers them with a new union keyword. A union type declares that a value is exactly one of a closed set of types, and the compiler enforces that you handle every case. Add a new case and every switch that skips it becomes a compile error.
public union Result<TSuccess, TError>(TSuccess, TError);
string Describe(Result<string, Exception> r) => r switch
{
string s => $"OK: {s}",
Exception e => $"Error: {e.Message}",
};
No discard pattern needed — the compiler knows the set is exhaustive. This replaces abstract base class boilerplate and third-party OneOf<T1, T2> workarounds. For domain modeling, event sourcing, and API result types, this is the kind of language support that changes how you structure code. The companion closed modifier for class hierarchies rounds it out: a closed class can only be subclassed within the same assembly, giving you airtight sealed models. See the full C# 15 union types deep dive on the .NET blog.
Runtime Async: Opt-In Now, Default in .NET 12
Runtime async moves the async/await state machine out of the compiler and into the JIT. The compiler emits a leaner IL contract, the runtime handles suspension and resumption, and the results are concrete: 3.5x faster on deep async chains, 21x less memory allocated. ASP.NET Core and the in-box runtime libraries are already built this way in .NET 11.
<PropertyGroup>
<TargetFramework>net11.0</TargetFramework>
<Features>runtime-async=on</Features>
</PropertyGroup>
It is opt-in in .NET 11 and becomes the default in .NET 12. If you are evaluating .NET 11, enabling this in a staging environment is worth the five minutes it takes. The performance improvements post covers the numbers in detail.
Free Speed: The CLI Gets a Native AOT Host
The SDK CLI now uses a Native AOT host by default. Commands like dotnet --version no longer spin up a managed runtime to print a string. dotnet tool list drops from 378 ms to 68 ms. Tool dispatch commands like dotnet ef fall from roughly 700 ms to around 200 ms. No configuration change needed — just upgrade and get faster feedback loops. MAUI also moves to CoreCLR as its default runtime across all platforms, unifying the runtime story for desktop and mobile.
Who Should Upgrade to What, Right Now
On .NET 8 or .NET 9: Upgrade to .NET 10 LTS. You are on an unsupported runtime today. .NET 10 shipped last month, it is the stable long-term choice, and the migration is small. That is not a someday problem.
Starting a new project or already on .NET 10: .NET 11 is worth a pilot branch, especially for C# 15 union types. The two-year support window is the trade-off you are accepting, and you will upgrade again when .NET 12 LTS ships in 2027.
Organization requires LTS for production: Stay on .NET 10 until .NET 12 LTS. .NET 11 is not for you — that is exactly what Microsoft’s release model predicts. See the full .NET 11 announcement for the official migration notes and updated support timeline.

