What are the correct version numbers for C# and their release dates? What came out when? Why can’t I find any answers about C# 3.5?
This question is primarily to aid those who are searching for an answer using an incorrect version number, e.g. C# 3.5. The hope is that anyone failing to find an answer with the wrong version number will find this question and then search again with the right version number.
C# version numbers follow a specific sequence without a “3.5” release, as the correct progression goes from C# 3.0 directly to C# 4.0. The confusion often arises from the .NET Framework 3.5, which contains C# 3.0 but was released separately from the language specification. Here’s the complete C# version timeline with proper release dates to help you find accurate information about the language’s evolution.
Contents
- C# Version History and Release Timeline
- Why C# 3.5 Doesn’t Exist
- .NET Framework vs C# Language Versions
- C# 5.0 Through Modern Releases
- How to Find Accurate C# Documentation
C# Version History and Release Timeline
C# has evolved through several major versions since its initial release, each introducing significant features and improvements. Here’s the complete chronological list of official C# language versions:
Early C# Versions (2000-2005)
-
C# 1.0 - January 2002
- Released alongside .NET Framework 1.0
- Basic object-oriented features and syntax
- Foundation for modern C# development
-
C# 1.2 - April 2003
- Released with .NET Framework 1.1
- Minor improvements and bug fixes
- Enhanced debugging capabilities
Major Evolution (2005-2010)
-
C# 2.0 - November 2005
- Released with .NET Framework 2.0
- Generics support
- Anonymous methods
- Nullable value types
- Iterators (yield keyword)
-
C# 3.0 - November 2007
- Released with .NET Framework 3.5
- LINQ (Language Integrated Query)
- Lambda expressions
- Extension methods
- Anonymous types
- Implicitly typed local variables (var)
-
C# 4.0 - April 2010
- Released with .NET Framework 4.0
- Dynamic programming
- Named and optional parameters
- Generic covariant and contravariant
- COM interoperability improvements
Modern C# Era (2012-Present)
-
C# 5.0 - August 2012
- Released with .NET Framework 4.5
- Async/await pattern
- Caller information attributes
-
C# 6.0 - July 2015
- Released with .NET Framework 4.6
- String interpolation
- Null-conditional operator (?.)
- Auto-property initializers
- Expression-bodied members
-
C# 7.0 - March 2017
- Released with .NET Core 2.0
- Pattern matching
- Tuples
- Out variables
- Local functions
- Binary literals
-
C# 7.1 - August 2017
- Async Main method
- Default literal expressions
- Inferred tuple element names
-
C# 7.2 - November 2017
- Reference semantics with value types
- Non-trailing named arguments
- Leading digit separator
-
C# 7.3 - May 2018
- Stackalloc arrays in nested contexts
- Fixed statement enhancements
- Generic constraints improvements
-
C# 8.0 - September 2019
- Nullable reference types
- Async streams
- Using declarations
- Null-coalescing assignment
- Switch expressions
- Default interface methods
-
C# 9.0 - November 2020
- Records
- Init-only accessors
- Pattern matching enhancements
- Top-level programs
- Target-typed new expressions
-
C# 10.0 - November 2021
- Record structs
- Extended property patterns
- File-scoped namespaces
- Required members
- Global using directives
-
C# 11.0 - November 2022
- Generic math
- Raw string literals
- Required members on interfaces
- List patterns
- UTF-8 string literals
-
C# 12.0 - November 2023
- Primary constructors
- Collection expressions
- Alias any type
- Experimental attributes
- Ref and scoped parameters
Why C# 3.5 Doesn’t Exist
The confusion about “C# 3.5” stems from a misunderstanding between the .NET Framework versioning and the C# language versioning. Here’s why you won’t find any information about C# 3.5:
The Framework vs Language Distinction
The .NET Framework 3.5 was released in November 2007 and contained the C# 3.0 compiler and language features. Microsoft used this naming convention where the framework version number didn’t correspond directly to the C# language version inside it.
Key Point: .NET Framework 3.5 included C# 3.0, not C# 3.5. The framework version was simply a packaging version, while the language version was separate.
Version Numbering Logic
C# language versions follow a sequential numbering system that corresponds to major language specification releases, while .NET Framework versions used a different numbering scheme that included incremental releases and service packs.
- C# 3.0 was the language specification
- .NET Framework 3.5 was the runtime environment that delivered C# 3.0
This explains why developers searching for “C# 3.5” documentation find nothing - because there was never a C# language version 3.5, only a .NET Framework version 3.5 that contained C# 3.0.
.NET Framework vs C# Language Versions
Understanding the relationship between these versioning systems is crucial for finding accurate information:
Framework Versioning
The .NET Framework versioning was designed to package multiple technologies:
- Version 3.0: Added Windows Presentation Foundation (WPF), Windows Communication Foundation (WCF), and Windows Workflow Foundation (WF)
- Version 3.5: Added LINQ, ADO.NET Entity Framework, and other features while still containing C# 3.0
Language Versioning
C# language versions are tied to the language specification and compiler, not the framework:
- Each major C# version introduces new language features and syntax
- Language versions can be used with different framework versions
- Starting with .NET Core, language and framework versioning became more aligned
Modern Versioning (Post-.NET Core)
Since the introduction of .NET Core in 2016, the versioning has become more straightforward:
- .NET Core 2.0: C# 7.0
- .NET Core 3.0: C# 8.0
- .NET 5: C# 9.0 (skipped version 4 to avoid confusion with .NET Framework 4.x)
- .NET 6: C# 10.0
- .NET 7: C# 11.0
- .NET 8: C# 12.0
- .NET 9: C# 13.0 (preview)
C# 5.0 Through Modern Releases
For those looking for information about more recent C# versions, here’s what each major release introduced:
C# 5.0 (2012) - The Async Revolution
C# 5.0 brought revolutionary async programming capabilities:
// Before C# 5.0
Task<string> GetDataAsync()
{
var task = new Task<string>(() => {
Thread.Sleep(1000);
return "Data";
});
task.Start();
return task;
}
// C# 5.0 and later
async Task<string> GetDataAsync()
{
await Task.Delay(1000);
return "Data";
}
C# 6.0 (2015) - Productivity Focus
C# 6.0 focused on developer productivity and code simplification:
// String interpolation instead of string.Format
var name = "World";
var greeting = $"Hello, {name}!";
// Null-conditional operator
var length = name?.Length ?? 0;
// Auto-property initializers
public class Person { public string Name { get; set; } = "Unknown"; }
C# 7.0+ (2017-Present) - Modern C#
Each subsequent version has brought significant new features:
- C# 7.0: Pattern matching, tuples, local functions
- C# 8.0: Nullable reference types, async streams, switch expressions
- C# 9.0: Records, init-only accessors, top-level programs
- C# 10.0: Record structs, file-scoped namespaces
- C# 11.0: Generic math, raw string literals
- C# 12.0: Primary constructors, collection expressions
How to Find Accurate C# Documentation
When searching for C# information, follow these guidelines to find the right documentation:
Use Correct Version Numbers
Always search for the specific C# language version, not .NET Framework versions:
- ✅ Correct: “C# 8.0 features”
- ❌ Incorrect: “C# 3.5 features”
- ✅ Correct: “C# 12.0 pattern matching”
- ❌ Incorrect: “C# 3.5 LINQ” (LINQ was in C# 3.0)
Official Documentation Sources
Consult authoritative sources for accurate information:
- Microsoft Learn - Official Microsoft documentation
- C# Language Specification - The definitive source for language features
- What’s New in C# - Microsoft’s guides for each version
- GitHub .NET Repository - Source code and implementation details
Version-Specific Search Terms
When researching, include both the version number and feature name:
- “C# 8.0 nullable reference types”
- “C# 9.0 records example”
- “C# 10.0 file-scoped namespaces”
This approach will help you find accurate, version-specific information rather than getting confused by framework vs. language versioning.
Sources
- Microsoft Learn - C# Version History
- .NET Documentation - C# Language Versioning
- C# Language Specification Overview
- .NET Framework Version History
- C# Feature Timeline by JetBrains
Conclusion
Understanding the correct C# version numbering is essential for finding accurate documentation and avoiding confusion. The key takeaways are:
- No C# 3.5 exists - The correct version was C# 3.0, released with .NET Framework 3.5 in November 2007
- Framework vs Language versions are different - .NET Framework 3.5 contained C# 3.0, not a separate language version
- Use correct version numbers when searching: C# 1.0 through C# 12.0 are the official language versions
- Modern releases follow .NET versioning: .NET 5+ aligns C# and .NET version numbers
- Search strategically using version-specific terms like “C# 8.0 features” instead of framework-based terms
If you’re searching for information about a specific C# feature and can’t find it, try using the correct C# language version number in your search terms. This will lead you to the accurate documentation you need while avoiding the confusion caused by the .NET Framework 3.5 vs. C# 3.0 misunderstanding.