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

其他回答

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

阅读更多信息

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

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#语言版本中添加的功能。还有一个跟踪即将推出和最近实现的语言功能的页面。

比较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

我总结了本表中的大多数版本。唯一缺少的应该是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)计划于何时发布?

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