.NET 11 Preview: The Two Features Devs Should Be Excited About

Heads up: .NET 11 is still in preview, and everything below is based on Preview 6. Details could shift before the final release, so treat this as a sneak peek rather than a spec sheet.

The .NET 11 previews have been quietly stacking up some genuinely exciting improvements, and two of them stand out for how much they change the day-to-day experience of writing code. One lives deep in the runtime; the other lands right in the C# language you type every day. Let’s dig in.

1. Runtime Async: async that finally behaves in a debugger

If you’ve ever stared at a stack trace from a heavily-asynchronous production incident, you know the pain. Instead of a clean chain showing which method called which, you get a mess of compiler-generated state machine types—MoveNext() frames, AsyncMethodBuilder plumbing, and gaps where your actual logic used to be. Piecing together “what actually happened” becomes detective work.

Historically this is because async/await was handled almost entirely by the C# compiler. It rewrote your method into a state machine at compile time, and the runtime just saw the resulting machinery—not your original intent. Great for portability, rough for diagnostics.

Runtime Async moves a big chunk of that work down into the runtime itself. The payoff is threefold:

  • Cleaner stack traces. Async call chains look a lot more like the code you wrote, so tracing a failure through several awaits stops being a puzzle.
  • Lower overhead. Handling async at the runtime level means less generated boilerplate and fewer allocations in hot async paths.
  • Less painful debugging. Stepping through async code and reading exception traces just gets more predictable.

Why does the stack trace bit matter so much? Because when something breaks at 2 a.m. in production, the stack trace is often all you’ve got. If it reads like an honest map of your call chain instead of a wall of compiler artifacts, you find the root cause in minutes instead of hours. That’s not a nice-to-have—that’s real time back in your life.

There’s a strong signal Microsoft is confident here: as of recent previews, Runtime Async no longer requires the EnablePreviewFeatures flag for projects targeting net11.0, and the runtime libraries themselves now ship compiled with runtime-async turned on. When the platform’s own libraries are built on it, that tells you it’s graduating from “experiment” to “foundation.”

2. C# 15: extension indexers and built-in union types

The language side of .NET 11 brings two additions that quietly kill a lot of boilerplate.

Extension indexers

.NET 10 kicked off the “extension members” work, letting you add methods and properties to existing types through extension blocks. But it left a gap: you couldn’t add an indexer—the this[...] syntax—to a type you don’t own.

C# 15 closes that gap. Now you can attach indexer syntax to an existing type from an extension block. In plain terms: if you’ve got some type that logically “should” support thing[key] access but the original author never added it, you can bolt that ergonomic syntax on yourself—no wrapper class, no awkward GetValue(key) helper method sitting off to the side.

It’s a small feature with an outsized effect on how natural your APIs feel to consume. Extension members are now a coherent set—methods, properties, and indexers—instead of a half-finished feature.

Built-in union types

How many times have you needed to express “this value is one of a few possible types”? Maybe a result that’s either a Success or an Error, or a parser node that could be one of several shapes. Until now, C# made you hand-roll it: base classes with subtypes, clever enums paired with nullable fields, or a full discriminated-union library. It worked, but it was verbose and easy to get subtly wrong.

C# 15 adds built-in union support types, giving the language a native way to say “this is one of these options.” The benefits are immediate:

  • Less boilerplate. No more scaffolding a class hierarchy just to model a few alternatives.
  • More expressive intent. The type itself declares the possibilities, so readers (and the compiler) know exactly what they’re dealing with.
  • Safer handling. Modeling “one of several” as a first-class concept plays much nicer with pattern matching than the improvised approaches did.

Together, these two additions push C# further toward code that says what you mean with less ceremony—which is exactly the direction most of us want the language to go.

The through-line

What’s nice about this release is that both headliners share a theme: reducing friction. Runtime Async makes the code you already wrote easier to debug and cheaper to run. The C# 15 features let you express your intent with less scaffolding. Neither is a flashy gimmick—they’re the kind of improvements you feel every day.

If you like poking at things early, grab the .NET 11 preview SDK and take Runtime Async and the new C# 15 features for a spin. Just remember it’s still preview software (this was written against Preview 6), so expect some churn before general availability, which is currently expected in November 2026. Have fun experimenting.

Posted on: July 29, 2026, by :