NeuroAgent

Complete C# Version History and Release Dates

Complete C# version timeline with all release dates from 1.0 to 12.0. Learn why C# 3.5 doesn't exist and the difference between .NET Framework and C# language versions.

Question

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.

NeuroAgent

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

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:

csharp
// 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:

csharp
// 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:

  1. Microsoft Learn - Official Microsoft documentation
  2. C# Language Specification - The definitive source for language features
  3. What’s New in C# - Microsoft’s guides for each version
  4. 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

  1. Microsoft Learn - C# Version History
  2. .NET Documentation - C# Language Versioning
  3. C# Language Specification Overview
  4. .NET Framework Version History
  5. 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:

  1. No C# 3.5 exists - The correct version was C# 3.0, released with .NET Framework 3.5 in November 2007
  2. Framework vs Language versions are different - .NET Framework 3.5 contained C# 3.0, not a separate language version
  3. Use correct version numbers when searching: C# 1.0 through C# 12.0 are the official language versions
  4. Modern releases follow .NET versioning: .NET 5+ aligns C# and .NET version numbers
  5. 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.