A new C# version has come out with each .NET release since 2019, usually in November. The latest released version is C# 14, from November 2025. C# 15 ships with .NET 11, whose SDK was at release candidate 3 in October 2026.
Every version
| Version | Released | Shipped with |
|---|---|---|
| 1.0 | January 2002 | Visual Studio .NET 2002 |
| 1.2 | April 2003 | Visual Studio .NET 2003 |
| 2.0 | November 2005 | Visual Studio 2005 |
| 3.0 | November 2007 | Visual Studio 2008 |
| 4.0 | April 2010 | Visual Studio 2010 |
| 5.0 | August 2012 | Visual Studio 2012 |
| 6.0 | July 2015 | Visual Studio 2015 |
| 7.0 | March 2017 | Visual Studio 2017 |
| 7.1 | August 2017 | Visual Studio 2017 version 15.3 |
| 7.2 | November 2017 | Visual Studio 2017 version 15.5 |
| 7.3 | May 2018 | Visual Studio 2017 version 15.7 |
| 8.0 | September 2019 | .NET Core 3.0 |
| 9 | November 2020 | .NET 5 |
| 10 | November 2021 | .NET 6 |
| 11 | November 2022 | .NET 7 |
| 12 | November 2023 | .NET 8 |
| 13 | November 2024 | .NET 9 |
| 14 | November 2025 | .NET 10 |
| 15 | In .NET 11 (release candidate at the time of writing) | .NET 11 |
C# 1.0 and 1.2
C# 1.0 had classes, structs, interfaces, events, properties, delegates, operators,
statements and attributes. C# 1.2 made foreach dispose an enumerator that
implements IDisposable.
C# 2.0
- Generics
- Partial types
- Anonymous methods
- Nullable value types
- Iterators
- Covariance and contravariance for delegates
- Separate accessibility for property getters and setters
- Method group conversions
- Static classes
C# 3.0
C# 4.0
- Dynamic binding
- Named and optional arguments
- Generic covariance and contravariance
- Embedded interop types
C# 5.0
C# 6.0
Released with the Roslyn compiler, which is itself written in C#.
- Static imports
- Exception filters
- Auto-property initialisers and default values for getter-only properties
- Expression-bodied members
- Null-conditional operators
- String interpolation
nameof- Index initialisers
awaitincatchandfinally
C# 7.0 to 7.3
| Version | Added |
|---|---|
| 7.0 | out variables, tuples and deconstruction, pattern matching, local functions, more expression-bodied members, ref locals and returns, discards, binary literals and digit separators, throw expressions |
| 7.1 | async Main, default literals, inferred tuple element names, pattern matching on type parameters |
| 7.2 | readonly struct, in parameters, ref readonly returns, ref struct, non-trailing named arguments, leading underscores in numeric literals, private protected, conditional ref expressions |
| 7.3 | Pinning-free access to fixed fields, reassigning ref locals, initialisers on stackalloc, fixed with any type supporting the pattern, more generic constraints (unmanaged, System.Enum, System.Delegate), == and != on tuples, expression variables in more places, attributes on the backing field of auto-properties |
C# 8.0
The first version aimed at .NET Core. Some features need runtime or library support that the .NET Framework does not have.
- Nullable reference types
- Readonly members
- Default interface members
- Switch expressions, and property, tuple and positional patterns
- Using declarations
- Static local functions, and parameters in lambdas and local functions that shadow outer names
- Disposable
ref struct - Asynchronous streams
- Indices and ranges
??=- Unmanaged constructed types
stackallocin nested expressions@$as well as$@for interpolated verbatim strings
C# 9
- Records
- Init-only setters
- Top-level statements
- Relational and logical patterns, type patterns
- Native-sized integers (
nint,nuint) - Function pointers
- Suppressing the
localsinitflag, module initialisers - New features for partial methods
- Target-typed
newand conditional expressions staticanonymous functions, lambda discard parameters- Covariant return types
- Extension
GetEnumeratorforforeach - Attributes on local functions
C# 10
- Record structs and improved struct initialisation
- Interpolated string handlers
- Global using directives
- File-scoped namespaces
- Extended property patterns
- Lambdas with a natural type, explicit return types and attributes
- Constant interpolated strings
sealedonToStringin records- Assignment and declaration mixed in a deconstruction
AsyncMethodBuilderon methods,CallerArgumentExpression- A new span form of
#line
C# 11
- Raw string literals
- Generic maths support: static abstract members and related features
- Generic attributes
- UTF-8 string literals
- Newlines in interpolation expressions
- List patterns
- File-local types
- Required members
- Auto-default structs
- Pattern matching
Span<char>on a constant string - Extended
nameofscope nintandnuintas aliases ofIntPtrandUIntPtrreffields andscoped- Improved method group conversion to delegates
- A warning for type names in all lower-case ASCII
C# 12
- Primary constructors for classes and structs
- Collection expressions and the spread element
- Inline arrays
- Default values for lambda parameters
ref readonlyparameters- Aliases for any type
- The
Experimentalattribute - Interceptors, as a preview feature
C# 13
paramscollections- The
System.Threading.Locktype and itslocksemantics - The
\eescape sequence - Small improvements to overload resolution with method groups
- The
^index in object initialisers reflocals and unsafe contexts in iterators and async methodsref structtypes implementing interfaces, andallows ref struct- Partial properties and indexers
- Overload resolution priority
C# 14
- Extension members
- Null-conditional assignment
nameofon unbound generic types- More implicit conversions for
Span<T>andReadOnlySpan<T> - Modifiers on simple lambda parameters
fieldbacked propertiespartialevents and constructors- User-defined compound assignment operators
- Preprocessor directives for file-based apps
C# 15
C# 15 is the default for projects targeting net11.0 in the .NET 11 SDK. At
the time of writing the latest SDK listed was 11.0.100-rc.3, from 25 October 2026.
Choosing a language version
The default language version depends on the project’s target framework:
| Target framework | Default |
|---|---|
| .NET 11 | C# 15 |
| .NET 10 | C# 14 |
| .NET 9 | C# 13 |
| .NET 8 | C# 12 |
| .NET 7 | C# 11 |
| .NET 6 | C# 10 |
| .NET 5 | C# 9 |
| .NET Core 3.x, .NET Standard 2.1 | C# 8.0 |
| .NET Core 2.x, .NET Standard 2.0 and earlier, .NET Framework | C# 7.3 |
The <LangVersion> project property overrides the default. Its values are
a version number, default or latestMajor (the latest released
major version), latest (the latest released version including minor ones),
and preview (the latest preview). Microsoft advises against
latest, and a language version newer than the target framework’s default
is not supported. #error version shows which version is in use.
Standards
C# is standardised by Ecma as ECMA-334 and by ISO as ISO/IEC 23270. The specification published on Microsoft Learn is the work towards a later edition, and includes newer features as they are added. It is the source of the clause numbers on these pages.
| Edition | Language version |
|---|---|
| ECMA-334, 1st edition (December 2001) | C# 1.0 |
| ECMA-334, 2nd edition (December 2002) | C# 1.2 |
| ECMA-334, 4th edition (June 2006) | C# 2.0 |
| ECMA-334, 5th edition (December 2017) | C# 5.0 |
| ECMA-334, 6th edition (June 2022) | C# 6.0 |
| ECMA-334, 7th edition (December 2023) | C# 7.3 |
Microsoft keeps a version history and publishes a feature specification for each newer language change.