C#的正确版本号是什么?什么时候出来的?为什么我找不到有关C#3.5的任何答案?

这个问题主要是为了帮助那些使用错误版本号(例如C#3.5)搜索答案的人。希望任何没有找到错误版本号答案的人都能找到这个问题,然后用正确的版本号再次搜索。


当前回答

C#1.0-Visual Studio.NET 2002

类别结构体接口事件财产代表表达声明属性直接常量

C#1.2-Visual Studio.NET 2003

在foreach中处理foreach over字符串专用化C#-Visual Studio 2005泛型分部工程类型匿名方法遍历器可为空的类型Getter/setter单独可访问性方法组转换(委托)静态类委托推断

C#3-Visual Studio 2008

隐式类型的局部变量对象和集合初始化器自动实现的财产匿名类型扩展方法查询表达式Lambda表达式表达式树分部法

C#4-Visual Studio 2010

动态绑定命名参数和可选参数通用委托和接口的协差和反差嵌入式互操作类型(“NoPIA”)

C#5-Visual Studio 2012

异步方法呼叫者信息属性

C#6-Visual Studio 2015

在线起草规范编译器即服务(Roslyn)将静态类型成员导入命名空间异常筛选器等待捕获/最终块自动属性初始化器仅用于getter的财产的默认值表达式体成员空传播器(空条件运算符,简洁的空检查)字符串插值操作员姓名字典初始值设定项

C#7.0-Visual Studio 2017

输出变量图案匹配多元组解构丢弃本地函数二进制字面值数字分隔符Ref返回和本地通用异步返回类型更多表情丰富的成员抛出表达式

C#7.1-Visual Studio 2017版本15.3

异步主默认表达式引用程序集推断的元组元素名称与泛型匹配的模式

C#7.2-Visual Studio 2017版本15.5

Span和ref类类型在参数和只读引用中Ref条件非尾随命名参数受私人保护的可访问性基数说明符后的数字分隔符

C#7.3-Visual Studio 2017版本15.7

System.Enum、System.Delegate和非托管约束。Ref-local重新赋值:现在可以使用Ref赋值运算符(=Ref)重新赋值Ref-locals和Ref参数。Stacklalloc初始化器:现在可以初始化堆栈分配的数组,例如Span x=Stackalloc[]{1,2,3};。索引可移动固定缓冲区:固定缓冲区可以索引到,而无需首先固定。自定义固定语句:可以在固定语句中使用实现适当GetPinnableReference的类型。改进的过载候选:可以尽早排除一些过载解决候选,从而减少歧义。初始化器和查询中的表达式变量:字段初始化器、构造函数初始化器和LINQ查询中允许使用表达式变量,如out var和pattern变量。元组比较:元组现在可以与==和!=进行比较。支持字段上的属性:允许自动实现的属性上的[field:…]属性以其支持字段为目标。

C#8.0-.NET Core 3.0和Visual Studio 2019 16.3版

可为null的引用类型:使用?,notnull约束和注释属性,编译器将使用这些属性来尝试和检测可能的null值被取消引用或传递给不合适的API。默认接口成员:接口现在可以具有具有默认实现的成员,以及静态/私有/受保护/内部成员(状态除外)(即无字段)。递归模式:位置和属性模式允许更深入地测试对象,开关表达式允许测试多个模式并以紧凑的方式生成相应的结果。异步流:await foreach和await using允许异步枚举和处理IAsyncEnumerable集合和IAsyncDisposable资源,异步迭代器方法允许方便地实现此类异步流。增强的using:using声明添加了隐式作用域,using语句和声明允许使用模式处理ref结构。范围和索引:i..j语法允许构造System.Range实例,^k语法允许构造System.Index实例,这些实例可用于索引/切片集合。空合并赋值:??=允许在值为空时有条件地赋值。静态局部函数:用Static修改的局部函数无法捕获此变量或局部变量,而局部函数参数现在会在父范围中隐藏局部变量。非托管泛型结构:只有非托管字段的泛型结构类型现在被视为非托管(即,它们满足非托管约束)。只读成员:现在可以将单个成员标记为只读,以指示和强制它们不修改实例状态。嵌套上下文中的Stacklalloc:现在在更多的表达式上下文中允许使用Stackalloc表达式。可选的插值逐字字符串:@$“…”字符串被识别为插值逐字字符串,就像$@“…”一样。属性访问器过时:属性访问器现在可以单独标记为过时。对于无约束类型参数,Permit为空

[来源]:https://github.com/dotnet/csharplang/blob/master/Language-Version-History.md

其他回答

Visual Studio.NET中的C#1.0Visual Studio 2005中的C#2.0Visual Studio 2008中的C#3.0Visual Studio 2010中的C#4.0C#5.0与Visual Studio 2012Visual Studio 2015中的C#6.0C#7.0与Visual Studio 2017C#8.0与Visual Studio 2019C#9.0与Visual Studio 2019

Version Language specification Microsoft compiler
C# 1.0/1.2 December 2001?/2003? January 2002?
C# 2.0 September 2005 November 2005?
C# 3.0 May 2006 November 2006?
C# 4.0 March 2009 (draft) April 2010?
C# 5.0 Released with .NET 4.5 in August 2012
C# 6.0 Released with .NET 4.6 2015
C# 7.0 Released with .NET 4.7 2017
C# 8.0 Released with .NET 4.8 2019

C#1.0-Visual Studio.NET 2002

类别结构体接口事件财产代表表达声明属性直接常量

C#1.2-Visual Studio.NET 2003

在foreach中处理foreach over字符串专用化C#-Visual Studio 2005泛型分部工程类型匿名方法遍历器可为空的类型Getter/setter单独可访问性方法组转换(委托)静态类委托推断

C#3-Visual Studio 2008

隐式类型的局部变量对象和集合初始化器自动实现的财产匿名类型扩展方法查询表达式Lambda表达式表达式树分部法

C#4-Visual Studio 2010

动态绑定命名参数和可选参数通用委托和接口的协差和反差嵌入式互操作类型(“NoPIA”)

C#5-Visual Studio 2012

异步方法呼叫者信息属性

C#6-Visual Studio 2015

在线起草规范编译器即服务(Roslyn)将静态类型成员导入命名空间异常筛选器等待捕获/最终块自动属性初始化器仅用于getter的财产的默认值表达式体成员空传播器(空条件运算符,简洁的空检查)字符串插值操作员姓名字典初始值设定项

C#7.0-Visual Studio 2017

输出变量图案匹配多元组解构丢弃本地函数二进制字面值数字分隔符Ref返回和本地通用异步返回类型更多表情丰富的成员抛出表达式

C#7.1-Visual Studio 2017版本15.3

异步主默认表达式引用程序集推断的元组元素名称与泛型匹配的模式

C#7.2-Visual Studio 2017版本15.5

Span和ref类类型在参数和只读引用中Ref条件非尾随命名参数受私人保护的可访问性基数说明符后的数字分隔符

C#7.3-Visual Studio 2017版本15.7

System.Enum、System.Delegate和非托管约束。Ref-local重新赋值:现在可以使用Ref赋值运算符(=Ref)重新赋值Ref-locals和Ref参数。Stacklalloc初始化器:现在可以初始化堆栈分配的数组,例如Span x=Stackalloc[]{1,2,3};。索引可移动固定缓冲区:固定缓冲区可以索引到,而无需首先固定。自定义固定语句:可以在固定语句中使用实现适当GetPinnableReference的类型。改进的过载候选:可以尽早排除一些过载解决候选,从而减少歧义。初始化器和查询中的表达式变量:字段初始化器、构造函数初始化器和LINQ查询中允许使用表达式变量,如out var和pattern变量。元组比较:元组现在可以与==和!=进行比较。支持字段上的属性:允许自动实现的属性上的[field:…]属性以其支持字段为目标。

C#8.0-.NET Core 3.0和Visual Studio 2019 16.3版

可为null的引用类型:使用?,notnull约束和注释属性,编译器将使用这些属性来尝试和检测可能的null值被取消引用或传递给不合适的API。默认接口成员:接口现在可以具有具有默认实现的成员,以及静态/私有/受保护/内部成员(状态除外)(即无字段)。递归模式:位置和属性模式允许更深入地测试对象,开关表达式允许测试多个模式并以紧凑的方式生成相应的结果。异步流:await foreach和await using允许异步枚举和处理IAsyncEnumerable集合和IAsyncDisposable资源,异步迭代器方法允许方便地实现此类异步流。增强的using:using声明添加了隐式作用域,using语句和声明允许使用模式处理ref结构。范围和索引:i..j语法允许构造System.Range实例,^k语法允许构造System.Index实例,这些实例可用于索引/切片集合。空合并赋值:??=允许在值为空时有条件地赋值。静态局部函数:用Static修改的局部函数无法捕获此变量或局部变量,而局部函数参数现在会在父范围中隐藏局部变量。非托管泛型结构:只有非托管字段的泛型结构类型现在被视为非托管(即,它们满足非托管约束)。只读成员:现在可以将单个成员标记为只读,以指示和强制它们不修改实例状态。嵌套上下文中的Stacklalloc:现在在更多的表达式上下文中允许使用Stackalloc表达式。可选的插值逐字字符串:@$“…”字符串被识别为插值逐字字符串,就像$@“…”一样。属性访问器过时:属性访问器现在可以单独标记为过时。对于无约束类型参数,Permit为空

[来源]:https://github.com/dotnet/csharplang/blob/master/Language-Version-History.md

处理C#版本号时最大的问题是,它没有绑定到.NET Framework版本,这似乎是由于Visual Studio和.NET Framework之间的同步发布。

C#的版本实际上绑定到编译器,而不是框架。例如,在Visual Studio 2008中,您可以编写C#3.0,并以.NET Framework 2.0、3.0和3.5为目标。C#3.0命名法描述代码语法和支持功能的版本,与ANSI C89、C90和C99描述C的代码语法和功能的方式相同。

看看Mono,你会发现Mono 2.0(大部分是从ECMA规范中实现的.NET Framework 2.0版本)支持C#3.0语法和特性。

这与这里的大多数答案相同,但为了方便起见,将其制成表格,并且它有Visual Studio和.NET版本以确保完整性。

C# version VS version .NET version CLR version Release date
1.0 2002 1.0 1.0 Feb 2002
1.2 2003 1.1 1.1 Apr 2003
2.0 2005 2.0 2.0 Nov 2005
3.0 2.0 Nov 2006
3.0 2008 3.5 2.0 Nov 2007
4.0 2010 4.0 4 Apr 2010
5.0 2012 4.5 4 Aug 2012
2013 4.5.1 4 Oct 2013
4.5.2 4 May 2014
6.0 2015 4.6 4 Jul 2015
4.6.1 4 Nov 2015
4.6.2 4 Aug 2016
7.0 2017 Mar 2017
4.7 4 May 2017
7.1 2017 (v15.3) Aug 2017
4.7.1 4 Oct 2017
7.2 2017 (v15.5) Dec 2017
4.7.2 4 Apr 2018
7.3 2017 (v15.7) May 2018
8.0 2019 4.8 4 Apr 2019
4.8.1 4 Aug 2022

.NET Core之后的版本

C# version VS version .NET version Release date End of Support
2015 Update 3 .NET Core 1.0 Jun 2016 Jun 2019
.NET Core 1.1 Nov 2016 Jun 2019
7.0 2017 Mar 2017
7.1 2017 (v15.3) .NET Core 2.0 Aug 2017 Oct 2018
7.3 2017 (v15.7) .NET Core 2.1 May 2018 Aug 2021
.NET Core 2.2 Dec 2018 Dec 2019
8.0 2019 Apr 2019
2019 (v16.3) .NET Core 3.0 Sep 2019 Mar 2020
2019 (v16.4) .NET Core 3.1 Dec 2019 Dec 2022
9.0 2019 (v16.8) .NET 5 Nov 2020 May 2022
10.0 2022 .NET 6 Nov 2021 Nov 2024
11.0 2022 (17.4) .NET 7 Nov 2022 May 2024
.NET 8 Nov 2023 Nov 2026

*-.NET 5.0不是.NET framework的更新版本,而是.NET Core 3。从.NET 5.0开始,没有更新版本的.NET完整框架。

**-.NET Core没有单独的CLR(CoreCLR)版本。无论.NET Core版本是什么,都是CoreCLR版本。所以不提它。


注意:.NET在很大程度上独立于VS和编译器版本,每个版本之间没有相关性。以上列表并不意味着某些版本的.NET与某些C#或VS版本绑定。这只是按照发布的时间顺序(VS/C#和.NET)编译的。有些发布恰好在一起,因此它们位于同一行。有关详细信息,请参阅“.NET Framework版本和依赖项”和“.NET发布节奏”。