The release of .NET 10 brings with it F# version 10. It’s a refinement‑focused update that enhances the language’s ergonomics, improves performance, and optimises compiler behaviour for everyday functional development.
For F# developers used to the patterns of F# 6‑9, many language improvements have focused on new syntax or major paradigms. With F# 10, the emphasis shifts: rather than introducing sweeping new features, the team targets clarity, consistency, and the performance foundations of large codebases. The value here is less about new features and more about polishing the day‑to‑day developer experience, well aligned with .NET 10’s positioning as a high‑performance, long‑term support (LTS) release.
As for language improvements, F# 10 introduces the #warnon directive paired with #nowarn, letting developers restrict suppression of compiler warnings to discrete code regions rather than disabling them globally.
Developers can now define automatic public properties that are privately mutable, with member val X = ... with public get, private set, avoiding the verbose backing‐field pattern previously needed.
// F# 9
type Ledger() =
[<DefaultValue>] val mutable private _Balance: decimal
member this.Balance with public get() = this._Balance and private set v = this._Balance <- v
// F# 10
type Ledger() =
member val Balance = 0m with public get, private set
F# 10 allows marking optional parameters with [<Struct>] attribute. Under the hood, the compiler uses stack-allocated ValueOption<T> instead of a heap-allocated Option<T>, reducing memory allocations in code hot paths. Other .NET languages had this optimisation for some time, and now F# has gained parity with them.
As for library and tooling improvements, async code that uses task expressions now can use and! keyword to await tasks more succinctly.
Performance optimisations in F#10 include better default trimming for linked files that strip unused metadata from published assemblies. It reduces file overhead if the solution is published with the parameter PublishTrimmed=true.The intermediate language (IL) compilation can now be done in parallel, reducing compilation time for large solutions. It is a setting called <ParallelCompilation>true</ParallelCompilation>. Another optimisation is the tail-call recursion compilation for final yield keywords in computation expressions.
Because F# 10 is a refinement release rather than a radical shift, upgrading is typically low‑risk, but there are compatibility notes to be aware of. For example, the scoped warning suppression feature changes how #nowarn and #warnon work and introduces breaking behaviour for multiline or empty warn directives. Also, some features (like parallel compilation) are only enabled for preview language versions and thus may not be production‑ready. Developers in large F# codebases should test trimming behaviour and async workflows to verify any unexpected changes (especially with older libraries).
The community feedback about the new changes is limited. On Reddit, one user expresses a mild surprise that there are no big new F# features to be announced. On X (formerly Twitter), there is a positive surprise from a developer that typed bindings in computational expressions can be done now without syntactic parentheses.
Microsoft’s Tomáš Grošup from the F# team has pointed out in Visual Studio Developer Community forum that the F# team is working on better thread management in larger programs, and moving F# tooling into its own standalone executable file. Both features should land around the end of 2026.
