The .NET 10 tracker
One bookmark for the .NET 10 LTS release.
This site uses Walter, an AI agent, for research, writing, and maintenance. Editorial and verification process
This pillar collects the site’s posts about .NET 10, the long-term support (LTS) release: new runtime and library features, upgrade errors, and the ecosystem packages that moved to it.
What to read first
For the overview, start with what’s new in .NET 10 and what’s new in C# 14. On the runtime side, stack allocation of value-type arrays, array enumeration de-abstraction and SearchValues show where the JIT and BCL got faster. For security, post-quantum cryptography with ML-KEM, ML-DSA and SLH-DSA covers the new APIs.
Upgrading from .NET 8? NuGet package pruning is on by default, and the surprises usually come from the SDK: API endpoints that return 401 instead of redirecting to login, conflicting static assets with the same target path, and Blazor routable components in another assembly. For MAUI, what’s new in .NET MAUI 10 is the starting point.
What’s on this page
The list below auto-collects posts tagged dotnet-10, newest first. For the next release, see the .NET 11 tracker; companion pillars are C# 14 features and the ASP.NET Core 11 cheat sheet.
Index (108 posts)
2026 / 11
- How to tell the C# nullable analyzer a member is not null when HasValue is true
Put [MemberNotNullWhen(true, nameof(X), nameof(Y))] on the HasValue property itself, naming the members that become non-null. It works for nullable value types and reference types, but the compiler barely checks the getter, ignores base-class members, and never notices when the state changes afterwards. Verified on .NET 10 SDK 10.0.302 and .NET 11 RC3.
- Why does string.GetHashCode() return a different value every run in .NET?
Since .NET Core, string.GetHashCode() is seeded with a random per-process value (Marvin hashing), so the same string hashes differently in every process. Why the runtime does it, which types are affected (HashCode.Combine, ValueTuple, records with string members), how Dictionary<string, T> quietly avoids the cost, and how to get a stable hash with XxHash3 or FNV-1a, verified on .NET 10.0.10.
2026 / 10
- FileSystemInfo.LastWriteTime setter vs File.SetLastWriteTime in .NET
Both end in the same OS call, so the timestamp written is identical. The differences are around it: which cache gets invalidated, whether directories work on Windows, how a non-UTC DateTime is converted, and whether you can target an open handle. Use File.SetLastWriteTimeUtc, by handle when the file is open. Verified on .NET 10.0.10.
- Fix: Azure DevOps NuGet restore fails with "Unable to find version 'x.y.z' of package" from an internal feed
The version exists, but the pipeline cannot see it. Check the build identity's feed role, the feed view in the URL, which nuget.config the task uses, package source mapping, and the 30-minute HTTP cache.
- Try pattern vs throwing exceptions for expected failures in C#
Return bool from a TryX method when failure is an ordinary outcome the caller will branch on, and throw when it is a bug or a broken precondition. Measured on .NET 10.0.10: a failed int.TryParse costs 4.9 ns, a caught FormatException costs 2,487 ns.
- Fix: Cannot access a disposed object. Object name: 'IServiceProvider'
Code resolved a service from a DI scope or root provider after it was disposed. Capture IServiceScopeFactory instead of IServiceProvider and create a fresh scope where the work runs.
- Fix: [MemberNotNull] has no effect on a static factory method and CS8618 still fires
CS8618 is checked when the constructor exits, and [MemberNotNull] on a static method is silently ignored for instance members. Pass the values into a private constructor instead.
- Fix: Response.Cookies.Append does not set the cookie in the browser in ASP.NET Core
The Set-Cookie header is sent, but the browser rejects or never stores it. Fix SameSite=None without Secure, missing credentials: 'include' plus AllowCredentials, consent policy, and late Append calls.
- Fix: The property 'X' is part of a key and so cannot be modified or marked as modified in EF Core
EF Core never updates a key value on a tracked entity. Stop copying the key from DTOs, use a unique index instead of an alternate key, and change a real key by inserting a new row and deleting the old one. Tested on EF Core 10.0.14.
- Fix: HttpProtocolException: The HTTP/2 server reset the stream. HTTP/2 error code 'PROTOCOL_ERROR'
A peer sent RST_STREAM with PROTOCOL_ERROR for one request. HttpClient never retries it. Find which hop reset the stream, fix the request it rejected, retry only idempotent calls, or drop that hop to HTTP/1.1.
- What happens to an expired MemoryCache entry, and when is it actually removed from memory?
An expired MemoryCache entry is not removed on a timer. It stays in the dictionary until a read touches it, a throttled background scan runs, or compaction kicks in. Here is exactly when each happens, and how to get eager eviction.
- How to mark a controller action's response as nullable in ASP.NET Core's built-in OpenAPI document
Microsoft.AspNetCore.OpenApi only marks a response nullable when the action returns a bare T? (and, on .NET 10, not even Task<T?>). ActionResult<T?> and IActionResult lose the annotation on both .NET 10 and .NET 11 RC2. Here is why, a tested operation transformer that fixes it, and the 204 No Content trap that makes the spec lie unless you also change MVC's formatter.
- What Does a C# `with` Expression Actually Copy, and Why Don't Computed Record Properties Recalculate?
A with expression calls the record's compiler-generated <Clone>$ method, which runs a copy constructor that copies every instance field and skips all initializers. That is why properties initialized from other properties, cached values, and Guid IDs come out stale. Measured on .NET 10 with C# 14, with the fixes that actually work.
- What Is the Difference Between a Source-Breaking and a Binary-Breaking Change in a .NET Library?
A source-breaking change stops consumer code from compiling the next time it is rebuilt; a binary-breaking change makes already-compiled consumers fail at run time with MissingMethodException, MissingFieldException or TypeLoadException. Measured on .NET 10 with a v1/v2 DLL swap, plus what package validation catches and what it misses.
- Migrate a Blazor App With Routable Components in Another Assembly from .NET 8 to .NET 10
Upgrading a Blazor Web App whose pages live in a Razor class library or a .Client project from .NET 8 to .NET 10: what stays the same (both AdditionalAssemblies registrations), and the four things that break, from a 404 on blazor.web.js in thin hosts to NotFoundPage pages that render blank. Measured on ASP.NET Core 8.0.32 and 10.0.10.
- Fix: FileInfo.Length returns a stale size for a file that is still being written on Windows
FileInfo caches its size, enumeration reads NTFS's lazily updated directory entry, and the writer may still hold bytes in its own buffers. Refresh(), or better, read the length from a shared handle with RandomAccess.GetLength.
- Fix: NU1608 / NU1107 version conflict between Pomelo.EntityFrameworkCore.MySql and EF Core 10
Pomelo 9.0.0 only allows EF Core Relational 9.0.x and has no EF Core 10 build. Keep every EF Core package on 9.0.x, or switch to Microting.EntityFrameworkCore.MySql 10.0.x. Suppressing the warning crashes at startup.
- Fix: Settings file 'DotnetToolSettings.xml' was not found in the package
The tool package targets a newer .NET than the SDK running the install, or it is not a .NET tool at all. Use a newer SDK, pin a tool version with a compatible tools folder, or force --framework.
- How to discard buffered keypresses before Console.ReadKey in a C# console game loop
Drain the console input buffer with while (Console.KeyAvailable) Console.ReadKey(true) before you wait for a fresh key, and drain it every frame in a game loop so key repeat cannot pile up. How the buffer works on Windows and Unix in .NET 10, why held keys lag, the Unix echo trap, and FlushConsoleInputBuffer.
- How to check whether an entity is already tracked by the DbContext before attaching it in EF Core
Use DbSet.Local.FindEntry(key) to ask the change tracker whether an entity with a given key is tracked, without a database round trip or a scan. Why Entry(entity).State lies for this question, why Find queries, and a tested AttachOrMerge helper for EF Core 10.
- Fix: dotnet test falls back to VSTest in a Linux CI pipeline even though the project uses Microsoft.Testing.Platform
dotnet test picks its runner from global.json found by walking up from the working directory. On Linux CI it falls back to VSTest when that file is missing, misnamed, has a mis-cased key, or the SDK is older than 10.
- How to add a strong-named assembly's full public key to InternalsVisibleTo in an SDK-style project
A signed assembly must name its friend by the full 320-character public key, not the token, or the build fails with CS1726 or CS0281. Get the key with sn -p and sn -tp, or with a cross-platform .NET script, then put it in the Key metadata of an InternalsVisibleTo item in the .csproj. Covers the PublicKey property fallback, Moq's DynamicProxyGenAssembly2 key, and the line-break trap.
- How to detect Windows session lock, unlock, logon and logoff events in a C# app
Use SystemEvents.SessionSwitch in a desktop or console app, override OnSessionChange in a Windows service, or hook WM_WTSSESSION_CHANGE yourself. Covers .NET 10 code for all three, the hidden '.NET System Events' thread, why services see logon but desktop apps do not, out-of-order notifications, and how to query the current lock state with WTSQuerySessionInformation.
- How to set PostgreSQL session parameters such as search_path or statement_timeout on every EF Core connection with Npgsql
A SET statement run once is wiped by DISCARD ALL the moment Npgsql returns the connection to its pool. Put search_path and statement_timeout in the startup packet with the Search Path and Options connection string keywords, fall back to ALTER ROLE or a ConnectionOpened interceptor, and know why UsePhysicalConnectionInitializer silently loses its SET.
- Fix: dotnet test exits with code 5 and "Zero tests ran" on Microsoft.Testing.Platform
Exit code 5 means MTP rejected a command-line option, not that tests are missing. Run the test exe directly to see the real error, then add the extension package or route the option per project.
2026 / 09
- Fix: launchSettings.json environment variables are ignored for a commandName: Executable profile
If your Executable profile runs dotnet run or dotnet watch, the inner command applies the default profile and overwrites your variables. Add --no-launch-profile, and use SDK 10.0.200+.
- Fix: Android status bar icons become unreadable after enabling UseMaterial3 in .NET MAUI 10
MAUI 10.0.100 picks status bar icon colors from colorPrimary, which is the opposite brightness of the Material 3 surface, so you get white on white or black on black. Update Microsoft.Maui.Controls to 10.0.101 or later, or reset AppearanceLightStatusBars in MainActivity.
- Fix: dotnet watch Blazor hot reload WebSocket fails on a custom local domain (403)
Since the September 2026 .NET SDKs (10.0.112, 10.0.401, 11 RC1), dotnet watch rejects browser-refresh WebSockets from unknown origins. Set DOTNET_WATCH_AUTO_RELOAD_WS_ORIGINS to your host name.
- Fix: .NET MAUI Entry with Keyboard.Numeric shows a small numpad, then the full keyboard, on iPadOS 26
On iPadOS 26, MAUI maps Keyboard.Numeric to UIKeyboardType.DecimalPad, which now opens as a floating mini numpad. Append a mapper that switches iPad to NumbersAndPunctuation and filter input yourself.
- Fix: MAUIR0001 MissingMethodException in .NET MAUI Resizetizer on an SVG with <filter> or <text>
MAUI 10.0.101 and 10.0.110 Resizetizer ship mismatched System.Memory references, so SVGs with filters or text fail. Pin Resizetizer 10.0.100 or strip the filter and text.
- Fix: MediaPicker.CapturePhotoAsync returns a PNG instead of a JPEG in .NET MAUI 10
On iOS, MAUI 10 re-encodes camera photos as PNG whenever CompressionQuality is 90 or higher and no MaximumWidth/Height is set, which includes the default. Set CompressionQuality to 89 or lower, or add a MaximumWidth on iOS only.
- Fix: ASP.NET Core returns 400 "The X field is required" for a non-nullable string property
With <Nullable>enable</Nullable>, MVC treats every non-nullable reference type as [Required(AllowEmptyStrings = true)]. Mark optional properties as string?, give them a default, or set SuppressImplicitRequiredAttributeForNonNullableReferenceTypes.
- Fix: Conflicting assets with the same target path after upgrading to the .NET 10 SDK
On the .NET 10 SDK every Microsoft.NET.Sdk.Web project gets StaticWebAssetBasePath=/, so a web app referencing another web app collides. Set the base path on the referenced project. Disabling compression does not help.
- Fix: HttpIOException: The response ended prematurely from HttpClient in .NET
HttpClient reuses a keep-alive connection the server just closed, or the server drops the connection mid-response. Lower PooledConnectionIdleTimeout below the server's idle timeout and retry only idempotent requests.
- Fix: Unable to find the required 'IAuthenticationService' service with [Authorize(Policy = ...)] in Blazor
A Blazor Web App page with [Authorize] becomes an endpoint the AuthorizationMiddleware checks, and a failed check calls ChallengeAsync, which needs AddAuthentication. Register a real scheme, or pass component endpoints through to AuthorizeRouteView.
- Fix: custom DelegatingHandler does not run again on each retry with AddStandardResilienceHandler
A DelegatingHandler registered before AddStandardResilienceHandler runs once per logical request, not once per retry. Move it after the resilience handler, and make it idempotent, because the retry re-sends the same HttpRequestMessage. Measured on Microsoft.Extensions.Http.Resilience 10.10.0 and 8.10.0.
- Fix: IConfiguration.Bind does not populate an array or List<T> property from appsettings.json
The binder silently skips array properties without a public setter, get-only IReadOnlyList<T>, fields and init-only members under the source generator, and it appends to defaults instead of replacing them. Measured on .NET 10.0.12 and 11 RC 1.
- How to serialize public fields like Vector3 and Quaternion with System.Text.Json
System.Text.Json writes Vector3 as {} and Quaternion as {"IsIdentity":false} because they store data in public fields. Here is how IncludeFields, a custom converter, a resolver modifier and source generation fix it, measured on .NET 10 and .NET 11 RC 1.
- How to add the current user id to every log entry in ASP.NET Core
A BeginScope middleware misses the exception handler's error log and the Request finished line. Register an ILogEnricher that reads the user from IHttpContextAccessor, open a scope only when work leaves the request, and watch out for Serilog's AddSerilog silently cancelling enrichment.
- How to use an Oracle sequence to generate primary keys in EF Core
Map an EF Core key to an Oracle sequence with UseSequence in Oracle.EntityFrameworkCore 10: the DDL and INSERT SQL the provider really emits, how to point at an existing sequence or a legacy trigger, why quoting and HiLo trip people up, and how to move an identity column onto a sequence without ORA-00001.
- Fix: UIKitThreadAccessException from MediaPicker.PickPhotosAsync when selecting multiple photos in .NET MAUI iOS
Picking 2 or more photos on iOS throws UIKitThreadAccessException in MAUI 10.0.100 and 10.0.101. MAUI reads PHPickerResult.ItemProvider after an await, off the main thread. Pin 10.0.90, upgrade to 10.0.110, or use a PHPicker shim.
- Fix: ASP.NET Core API endpoints return 401 instead of redirecting to the login page after upgrading to .NET 10
In .NET 10 cookie auth answers API-style endpoints with 401/403 instead of a login redirect. Restore it per endpoint, globally, or with an AppContext switch.
- Fix: EF Core MigrateAsync and CanConnectAsync keep retrying on 'Login failed for user' for 60 seconds
EF Core's SQL Server existence check retries error 18456 for a full minute, with or without EnableRetryOnFailure. Fail fast, cap RetryTimeout, or wait for EF Core 12.
- How to enable R8 shrinking and obfuscation for a .NET MAUI Android release build
Set AndroidLinkTool to r8, keep trimming on, and add a ProguardConfiguration file. Why .NET 10 and .NET 11 RC 1 still ship un-obfuscated Java, how the new AndroidR8ObfuscationMode property changes that, and how to verify R8 actually ran.
- How to intercept the Android back button on a .NET MAUI Shell root page
Override OnBackButtonPressed on the root page and run .NET MAUI 10.0.101 or later. Why root pages stopped receiving back presses from 10.0.70 (Android 16) and 10.0.100 (every Android version), why .NET 11 RC 1 is still affected, why Shell.OnNavigating and BackButtonBehavior.Command do not help, and a MainActivity workaround for the broken versions.
- Fix: IsAuthenticated is false and RemoteUserAccount is null in Blazor WebAssembly after an MSAL upgrade
Microsoft.Authentication.WebAssembly.Msal 10.0.8, 9.0.16 and 8.0.27 moved to msal.js 4, whose async init races itself. Initialize MSAL once in Program.cs, or pin 10.0.7.
- Fix: PublishAot plus EFOptimizeContext exhausts memory during an EF Core build
EF Core's build-time model generation re-entered MSBuild until RAM ran out. Upgrade Tasks and Design to 10.0.10+, and on EF Core 11 delete EFOptimizeContext.
- Fix: AS JSON option can be specified only for column of nvarchar(max) type in WITH clause
EF Core emits [col] json '$.path' AS JSON inside OPENJSON WITH, which Azure SQL rejects with Msg 13618. Upgrade to EF Core 10.0.11+, or drop the provider compatibility level to 160.
- Fix: Complex entry original ordinal '-1' is invalid when saving a ToJson complex collection
Upgrade Microsoft.EntityFrameworkCore to 10.0.10 or later. Before that, growing a nested collection under a second ToJson complex property crashed SaveChanges.
- Fix: The complex type collection must be initialized to a non-null value
On EF Core 10.0.x, nulling a complex property that holds a two-element collection inside a ToJson complex collection breaks DetectChanges. Fixed in 11.0.0-rc.1.
- Fix: MissingMethodException 'AbstractionsStrings.ArgumentIsEmpty' after upgrading EF Core Tools
dotnet ef throws MissingMethodException on ArgumentIsEmpty because Tools 10.0.6 stopped pulling a matching Microsoft.EntityFrameworkCore.Design. Pin Design explicitly to your EF Core version.
- Migrate a .NET MAUI Android app to target Android API level 36
Google Play required target API 36 from 2026-08-31, with extensions running to 2026-11-01. Here is the full .NET MAUI path from net9.0-android to API 36: the target framework bump, the hardcoded uses-sdk that silently pins you to the old level, edge-to-edge with no opt-out, predictive back, and the large-screen orientation rules.
- Migrate off BinaryFormatter after its removal in modern .NET
BinaryFormatter's implementation was deleted in .NET 9 and still throws PlatformNotSupportedException on .NET 10 and .NET 11: how to choose a replacement serializer, read already-persisted NRBF blobs with NrbfDecoder, and what breaks in WinForms, WPF, and ResX.
2026 / 08
- Fix: Model building is not supported when publishing with NativeAOT in a .NET MAUI iOS build
iOS builds set DynamicCodeSupport=false, so EF Core refuses to build the model even though you never enabled NativeAOT. Ship a compiled model plus precompiled queries, or turn the interpreter back on.
- .NET MAUI 10.0.100 adds UsePlatformHandler for custom BlazorWebView backends
MAUI 10.0.100 ships MauiBlazorWebViewBuilderExtensions.UsePlatformHandler, a supported seam for replacing BlazorWebViewHandler without reimplementing everything AddMauiBlazorWebView() registers. Two overloads, one ordering trap.
- How to write a static extension member that applies to every enum type in C# 14
Declare a generic extension block with a struct, Enum constraint and you get Status.Values, Status.Count, and Status.Parse on every enum in your solution. The receiver shape, the CS0704 and CS0428 traps, and why you must cache Enum.GetValues.
- Fix: The call is ambiguous between the following methods or properties after moving to C# 14 extension members
CS0121 after moving an extension method into a C# 14 extension block: the compiler still emits the old static form. Delete the duplicate or qualify the call.
- How to make System.Text.Json ignore a property that has the required modifier
[JsonIgnore] on a required member throws InvalidOperationException: marked required but does not specify a setter. Here is why the two features collide and the four ways to ignore the property anyway, measured on .NET 10.
- Fix: Google Play rejects a Flutter or .NET MAUI app for missing 16 KB memory page size support
Play rejects the bundle because a 64-bit .so still has 4 KB ELF segments. Find the offending library, rebuild it with NDK r28+, and verify with zipalign -P 16.
- Fix: 404 Not Found for blazor.server.js after installing a new .NET SDK
blazor.server.js 404s on .NET 10 because the script stopped being an embedded resource. Add RequiresAspNetWebAssets to the host project, or make sure it has a .razor file.
- Fix: MSB4057 The target "ResolvePackageAssets" does not exist in the project in .NET MAUI
MSB4057 means a target ran against the outer cross-targeting build of a multi-targeted MAUI project. Pass a TFM, or guard the target with a TargetFramework condition.
- Fix: dotnet tool install --global dotnet-ef throws an error
Every way dotnet tool install --global dotnet-ef fails on the .NET 10 SDK, with the exact message and exit code for each: already installed, version not found, downgrade blocked, shim conflict, dead NuGet feed, and the runtime mismatch that only breaks after the install succeeds.
- Fix: The 'interceptors' feature is not enabled in this namespace
CS9137 comes from the Microsoft.AspNetCore.OpenApi source generator. Add InterceptorsNamespaces to every project that calls AddOpenApi, not just the one holding the PackageReference.
- Fix: The type or namespace name 'OpenApiReference' could not be found
OpenApiReference was deleted in Microsoft.OpenApi 2.0. Changing the using to Microsoft.OpenApi is not enough: replace each usage with a typed reference such as OpenApiSchemaReference.
- How to run a file-based C# app with `dotnet run app.cs` in .NET 11
A complete guide to file-based C# apps: running a single .cs file with dotnet run, the #:package, #:sdk, #:property, #:project and #:include directives, multi-file scripts with #:ref, argument and stdin handling, the build cache, native AOT publishing, packaging as a dotnet tool, and dotnet project convert when the script outgrows itself.
- Fix: CS1998 "This async method lacks 'await' operators and will run synchronously" in C#
CS1998 means an async method has no await, so it runs synchronously. Drop the async modifier and return Task.FromResult, or add the await you forgot.
2026 / 05
- .NET MAUI 10 SR6 finishes Material 3 on Android behind a single UseMaterial3 flag
MAUI 10 SR6 (10.0.60) extends Material 3 theming to Button, Entry, SearchBar, DatePicker, Slider, ProgressBar, ImageButton, Switch, and Shell on Android. Opt in with one MSBuild property. No custom renderers, no styles.xml edits.
- async void vs async Task in C#: when each is correct
async Task is the default and async void is the exception. Use async void only for event handlers, top-level message-loop handlers, and a handful of framework callbacks that demand a void signature. Everywhere else, async Task wins on exceptions, composition, and testability.
- NuGet Package Pruning Is On by Default in .NET 10
NuGet Package Pruning shipped on-by-default for net10.0 projects, cutting transitive vulnerability reports by 70% and restore times by up to 50%.
- record vs class vs struct in C#: a decision matrix
C# 14 gives you four data-type shapes -- class, record class, struct, and record struct. This is the decision matrix: when each one is correct, what each one costs, and the rules that pick for you.
- Fix: C# 14 overload resolution breaking change with Span and ReadOnlySpan
After upgrading to C# 14 / .NET 10, calls like array.Contains, x.Reverse(), and MemoryMarshal.Cast suddenly bind to different overloads or stop compiling. Here is what changed and how to pin the old behaviour where it matters.
- How to Expose an EF Core Database to an AI Agent via MCP
Wire an EF Core 10 DbContext into a Model Context Protocol server so Claude Code, Cursor, or any compliant client can run safe, scoped queries against your database. Covers IDbContextFactory lifetime, read-only projections, schema discovery tools, AsNoTracking, parameterised filters, row-level scoping, and the destructive-tool gates you need before letting an agent touch UPDATE.
2026 / 04
- Asp.Versioning 10.0 finally plays nicely with built-in OpenAPI in .NET 10
Asp.Versioning 10.0 is the first release that targets .NET 10 and the new Microsoft.AspNetCore.OpenApi pipeline. Sander ten Brinke's April 23 walkthrough shows how to register one OpenAPI document per API version with WithDocumentPerVersion().
- .NET 10 on Ubuntu 26.04: resolute Container Tags and Native AOT in the Archive
Ubuntu 26.04 Resolute Raccoon ships with .NET 10 in the archive, introduces -resolute container tags to replace -noble, and packages Native AOT tooling via dotnet-sdk-aot-10.0.
- Node.js Addons in C#: .NET Native AOT Replaces C++ and node-gyp
The C# Dev Kit team swapped its C++ Node.js addon for a .NET 10 Native AOT library, using N-API, UnmanagedCallersOnly, and LibraryImport to produce a single .node file without Python or node-gyp.
- C# 14 user-defined compound assignment operators: in-place += without the extra allocation
C# 14 lets you overload +=, -=, *=, and friends as void instance methods that mutate the receiver in place, cutting allocations for large value holders like BigInteger-style buffers and tensors.
- GitHub Copilot Modernization: The Assessment Report Is the Actual Product
GitHub Copilot Modernization is pitched as an Assess, Plan, Execute loop for migrating legacy .NET apps. The assessment phase is where the value lives: an inventory report, categorized blockers, and file-level remediation guidance you can diff like code.
- Microsoft Agent Framework 1.0: Building AI Agents in Pure C#
Microsoft Agent Framework hits 1.0 with stable APIs, multi-provider connectors, multi-agent orchestration, and A2A/MCP interop. Here is what it looks like in practice on .NET 10.
2026 / 03
- Generative AI for Beginners .NET v2: Rebuilt for .NET 10 with Microsoft.Extensions.AI
Microsoft's free generative AI course for .NET developers ships Version 2, rebuilt for .NET 10 and migrated from Semantic Kernel to Microsoft.Extensions.AI's IChatClient pattern.
2026 / 02
- C# 14 Extension Members: Extension Properties, Operators, and Static Extensions
C# 14 introduces extension members, allowing you to add extension properties, operators, and static members to existing types using the new extension keyword.
- C# 14 Null-Conditional Assignment: Using ?. and ?[] on the Left Side
C# 14 extends null-conditional operators to work on the left-hand side of assignments, eliminating verbose null checks when setting properties or indexers.
- .NET 10 Post-Quantum Cryptography: ML-KEM, ML-DSA, and SLH-DSA
.NET 10 adds native support for post-quantum cryptography algorithms ML-KEM, ML-DSA, and SLH-DSA, preparing your applications for a quantum-resistant future.
2026 / 01
- Scalar in ASP.NET Core: why your Bearer token is ignored (.NET 10)
If your Bearer token works in Postman but not in Scalar, the problem is likely your OpenAPI document. Here is how to declare a proper security scheme in .NET 10.
- TreatWarningsAsErrors without sabotaging dev builds (.NET 10)
How to enforce TreatWarningsAsErrors in Release builds and CI while keeping Debug flexible for local development in .NET 10, using Directory.Build.props.
- Perfetto + dotnet-trace: a practical profiling loop for .NET 9/.NET 10
A practical profiling loop for .NET 9 and .NET 10: capture traces with dotnet-trace, visualize them in Perfetto, and iterate on CPU, GC, and thread pool issues.
- CV Shortlist: historical notes on a .NET 10 AI SaaS
What the CV Shortlist author announced, what its former README described, and which .NET AI design ideas remain useful now that the public repository is unavailable.
- gRPC in Containers Feels “Hard” in .NET 9 and .NET 10: 4 Traps You Can Fix
Four common traps when hosting gRPC in containers with .NET 9 and .NET 10: HTTP/2 protocol mismatches, TLS termination confusion, broken health checks, and proxy misconfiguration -- with fixes for each.
- Microsoft `mcp`: Wiring Model Context Protocol Servers from C# on .NET 10
How to wire Model Context Protocol (MCP) servers in C# on .NET 10 using microsoft/mcp. Covers tool contracts, input validation, auth, observability, and production-readiness patterns.
- Monitor Background Jobs in .NET 9 and .NET 10 Without Hangfire: Health + Metrics + Alerts
Monitor BackgroundService jobs in .NET 9 and .NET 10 without Hangfire using heartbeat health checks, duration metrics, and failure alerts with a practical code example.
- .NET 10 file-based apps just got multi-file scripts: `#:include` is landing
.NET 10 adds #:include support for file-based apps, letting dotnet run scripts span multiple .cs files without creating a full project.
- System.CommandLine v2, but with the wiring done for you: `Albatross.CommandLine` v8
Albatross.CommandLine v8 builds on System.CommandLine v2 with a source generator, DI integration, and hosting layer to eliminate CLI boilerplate in .NET 9 and .NET 10 apps.
- Wave-IDE in 2026: the minimum Roslyn plumbing behind a WinForms IDE on .NET 10
Wave-IDE shows that WinForms and Roslyn on .NET 10 are enough to build a working C# IDE. Here is the minimum plumbing for incremental analysis, completion, and diagnostics.
- AWS Lambda Supports .NET 10: What to Verify Before You Flip the Runtime
AWS Lambda now supports .NET 10, but the runtime upgrade is not the hard part. Here is a practical checklist covering cold starts, trimming, native AOT, and deployment shape.
- .NET 10 made your NIC list explode? Filtering GetAllNetworkInterfaces() without lying to yourself
How to filter GetAllNetworkInterfaces() in .NET 10 when virtual adapters from Hyper-V, Docker, WSL, and VPNs flood the list. Includes a two-stage filter with explicit tradeoffs.
- Queryable Encryption + Vector Search in the MongoDB EF Core Provider (and why it matters for .NET 9 and .NET 10)
The MongoDB EF Core provider now supports Queryable Encryption and vector search. Here is what that means for .NET 9 and .NET 10 apps that already use EF Core.
- SwitchMediator v3: A Zero-Alloc Mediator That Stays Friendly to AOT
SwitchMediator v3 targets zero-allocation, AOT-friendly dispatch for .NET 9 and .NET 10 CQRS services. Here is what that means and how to benchmark your own mediator.
- .NET 10 Performance: SearchValues
Use SearchValues in .NET 10 for high-performance multi-string searching. Replaces foreach loops with SIMD-accelerated matching using Aho-Corasick and Teddy algorithms.
2025 / 04
- .NET 10: Stack allocation of arrays of value types
In .NET 10, the JIT can stack-allocate small fixed-size arrays of value types, eliminating heap allocations and delivering up to 60% faster performance compared to .NET 9.
- What’s new in .NET MAUI 10
A summary of new features, improvements, and breaking changes in .NET MAUI 10, released with .NET 10 and C# 14 in November 2025.
- How to change SearchBar’s icon color in .NET MAUI
How to change the SearchBar icon color in .NET MAUI using the new SearchIconColor property introduced in .NET 10.
- C# 14: Simplified parameters with modifiers in lambdas
C# 14 allows using ref, out, in, scoped, and ref readonly modifiers on implicitly typed lambda parameters, eliminating the need to explicitly declare parameter types.
- Partial constructors and events in C# 14
C# 14 lets you declare instance constructors and events as partial members, splitting definitions across files for cleaner code generation and separation of concerns.
- C# 14: nameof support for unbound generic types
C# 14 enhances the nameof expression to support unbound generic types like List<> and Dictionary<,>, eliminating the need for placeholder type arguments.
- Implicit Span conversions in C# 14 – First-class support for Span and ReadOnlySpan
C# 14 adds built-in implicit conversions between Span, ReadOnlySpan, arrays, and strings, enabling cleaner APIs, better type inference, and fewer manual AsSpan() calls.
- .NET 10: Array Enumeration Performance Improvements (JIT Array De-Abstraction)
In .NET 10, the JIT compiler reduces the overhead of iterating arrays through interfaces. See benchmarks comparing .NET 9 vs .NET 10 with foreach, IEnumerable, and conditional escape analysis.
- C# 14 – The field keyword and field-backed properties
C# 14 introduces the field contextual keyword for property accessors, letting you add custom logic to auto-properties without declaring a separate backing field.
2024 / 12
- What’s new in C# 14.0
A summary of all new features in C# 14.0, including the field keyword, extension members, null-conditional assignment, implicit span conversions, and more.
- What’s new in .NET 10
What's new in .NET 10: LTS release with 3 years of support, new JIT optimizations, array devirtualization, stack allocation improvements, and more.