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

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


C#语言版本历史记录:

以下是编写本文时已知的C#版本:

C#1.0与.NET 1.0和VS2002一起发布(2002年1月)C#1.2(足够奇怪);与.NET 1.1和VS2003一起发布(2003年4月)。对实现IDisposable的IEnumerators调用Dispose的第一个版本。其他一些小功能。与.NET 2.0和VS2005一起发布的C#2.0(2005年11月)。主要新特性:泛型、匿名方法、可空类型和迭代器块C#3.0与.NET 3.5和VS2008一起发布(2007年11月)。主要新特性:lambda表达式、扩展方法、表达式树、匿名类型、隐式类型(var)和查询表达式与.NET 4和VS2010一起发布的C#4.0(2010年4月)。主要的新特性:后期绑定(动态)、委托和接口泛型差异、更多COM支持、命名参数、元组数据类型和可选参数C#5.0与.NET 4.5和VS2012一起发布(2012年8月)。主要功能:异步编程和调用者信息属性。中断更改:循环变量关闭。C#6.0与.NET 4.6和VS2015一起发布(2015年7月)。由Roslyn实施。功能:自动实现的财产的初始值设定项,使用指令导入静态成员、异常过滤器、元素初始值设定值设定项、捕获中等待以及集合初始值设定中的扩展Add方法。C#7.0与.NET 4.7和VS2017一起发布(2017年3月)。主要新功能:元组、ref局部变量和ref返回、模式匹配(包括基于模式的开关语句)、内联参数声明、本地函数、二进制文本、数字分隔符和任意异步返回。C#7.1与VS2017 v15.3一起发布(2017年8月)。新特性:异步主、元组成员名称推断、默认表达式以及与泛型的模式匹配。C#7.2随VS2017 v15.5发布(2017年11月)。新功能:私有保护访问修饰符、Span<T>、又名内部指针、又名堆栈结构以及其他所有功能。C#7.3随VS2017 v15.7发布(2018年5月)。新功能:枚举、委托和非托管泛型类型约束。ref重新分配。不安全的改进:堆栈锁定初始化、未固定的索引固定缓冲区、自定义固定语句。提高过载分辨率。初始化器和查询中的表达式变量。==和!=为元组定义。汽车制造商的支持字段现在可以通过属性作为目标。C#8.0与.NET Core 3.0和VS2019 v16.3一起发布(2019年9月)。主要的新特性:可为空的引用类型、异步流、索引和范围、只读成员、使用声明、默认接口方法、静态本地函数以及内插逐字字符串的增强。C#9.0与.NET 5.0和VS2019 v16.8一起发布(2020年11月)。主要新功能:初始财产、记录、with-expressions、数据类、位置记录、顶级程序、改进的模式匹配(简单类型模式、关系模式、逻辑模式)、改进的目标类型(目标类型新表达式、目标类型?和?)以及协变返回。次要功能:放松ref和partial修饰符的排序、参数null检查、lambda丢弃参数、本机int、本地函数的属性、函数指针、静态lambda、扩展GetEnumerator、模块初始化器和扩展partial。C#10.0与.NET 6.0一起发布(2021 11月)。主要新功能:记录结构、结构无参数构造函数、插值字符串处理程序、全局使用指令、文件范围的命名空间声明、扩展属性模式、常量插值字符串、解构中的混合赋值和声明、单个方法的异步方法生成器(通过属性)、参数的CallerArgumentExpression属性、,增强的#line pragmas。C#11.0随.NET 7.0发布(2022年11月)。主要新功能:文件范围类型、通用数学支持、自动默认结构、模式匹配常量字符串上的Span<char>、扩展范围名称、数字IntPtr、UTF-8字符串文本、必需成员、ref字段和范围ref、原始字符串文本、改进的方法组转换为委托、警告波形7、通用属性、字符串插值表达式中的换行符、列表模式

针对OP的问题:

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

没有C#3.5这样的东西——这里的混淆是因为.NET 3.5中存在C#3.0。然而,语言和框架的版本是独立的,正如CLR一样,它的版本为2.0,适用于.NET 2.0到3.5,.NET 4引入了CLR 4.0,尽管有服务包。.NET4.5中的CLR有各种改进,但版本控制尚不清楚:在某些地方,它可能被称为CLR 4.5(例如,此MSDN页面曾以这种方式引用它),但Environment.Version属性仍然报告4.0.xxx。

截至2017年5月3日,C#语言团队在其GitHub存储库中创建了C#版本和功能的历史记录:C#语言版本中添加的功能。还有一个跟踪即将推出和最近实现的语言功能的页面。


处理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语法和特性。


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

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


比较MSDN文章“C#2.0语言和编译器中的新增功能”和“Visual C#2005中的新增”,可以推断出“C#major_version.minor_version”是根据编译器的版本编号创建的。

有与.NET 1.1和VS 2003相对应的C#1.2,也称为Visual C#.NET 2003。

但在进一步的研究中,微软停止了增加次要版本(在点之后)的数字,或者让它们不是零,0。尽管应该注意,与.NET 3.5对应的C#在msdn.microsoft.com中被命名为“Visual C#2008 Service Pack 1”。

有两种并行命名:按.NET/编译器主要版本编号和Visual Studio编号。

C#2.0是Visual C#2005的同义词

C#3.0对应(或者更准确地说,可以针对):

.NET 2.0<==>Visual C#2005.NET 3.0<==>Visual C#2008.NET 3.5<==>Visual C#2008 Service Pack 1


您可以在此处查看最新的C#版本


这与这里的大多数答案相同,但为了方便起见,将其制成表格,并且它有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发布节奏”。


我总结了本表中的大多数版本。唯一缺少的应该是ASP.NET核心版本。我还添加了不同版本的ASP.NET MVC。

请注意,ASP.NET 5已更名为ASP.NET Core 1.0,ASP.NET MVC 6已更名为ASP.NETCore MVC 1.0.0。我相信这一变化发生在2016年1月左右。

我已经在表中列出了ASP.NET 5 RC1的发布日期,但我还没有包括ASP.NET核心1.0和其他核心版本,因为我找不到确切的发布日期。您可以在此处阅读有关ASP.NET Core的发布日期的更多信息:ASP.NET Core 1.0(ASP.NET 5/vNext)计划于何时发布?


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#8.0是C#的最新版本。它仅在.NET Core 3.x和更高版本上受支持。许多最新功能都需要.NETCore3.x中引入的库和运行时功能。

下表列出了具有版本的目标框架及其默认C#版本。

源代码-C#语言版本控制


Version     .NET Framework     Visual Studio     Important Features

C#1.0.NET Framework 1.0/1.1 Visual Studio.NET 2002

基本功能

C#2.0.NET Framework 2.0 Visual Studio 2005

泛型分部工程类型匿名方法遍历器可为空的类型私有setter(财产)方法组转换(委托)协方差和反方差静态类

C#3.0.NET Framework 3.0\3.5 Visual Studio 2008

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

C#4.0.NET Framework 4.0 Visual Studio 2010

动态绑定(后期绑定)命名参数和可选参数通用协变量和反变量嵌入式互操作类型

C#5.0.NET Framework 4.5 Visual Studio 2012/2013

异步功能呼叫者信息

C#6.0.NET Framework 4.6 Visual Studio 2013/2015

表达式实体方法自动属性初始值设定项表达式名称主构造函数在挡块中等待异常筛选器字符串插值

C#7.0.NET Core 2.0 Visual Studio 2017

输出变量多元组丢弃图案匹配本地功能通用异步返回类型数字文字语法改进

C#8.0.NET Core 3.0 Visual Studio 2019

只读成员默认接口方法图案匹配增强功能:切换表达式属性模式褶皱图案位置模式使用声明静态局部函数一次性引用结构可为空的引用类型异步流异步一次性指数和范围空合并赋值未管理的构造类型嵌套表达式中的Stacklalloc增强内插逐字字符串


我在寻找.NET、C#、CLR和Visual Studio版本以及关键语言功能的简明历史。

由于我在一个地方找不到任何包含我所需所有信息的最新表格,我将Microsoft文档中的详细信息合并到了一个简洁的表格中。

这里提供:https://mantinband.github.io/dotnet-shmotnet/

我可能有一些错误或缺少信息,因此请随时打开问题或在此处投稿:https://github.com/mantinband/dotnet-shmotnet

偷偷偷看:


预览:C#11.0.NET Core 7.0 Visual Studio 2022更新1

阅读更多信息

允许在插值字符串的“孔”中使用换行符列出模式参数空值检查与可为空的引用类型的交互泛型属性字段关键字接口中的静态摘要或模式下的声明记录和初始化受歧视的工会T的参数范围语句作为表达式表达式树类型系统扩展