C# 的正确版本号是什么?

What are the correct version numbers for C#?

提问人: 提问时间:10/30/2008 最后编辑:34 revs, 28 users 24%Jon Skeet 更新时间:3/28/2023 访问量:420827

问:

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

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

C# NET 可视化工作室 net-core .net-framework-version

评论

92赞 12/2/2012
这是了解一切的良好来源之一。en.wikipedia.org/wiki/C_Sharp_(programming_language)
1赞 TankorSmash 1/12/2017
第二段不应该在评论中而不是问题中,因为它不是问题的一部分
31赞 Jon Skeet 1/12/2017
@TankorSmash:我认为作为问题的背景,它值得保留在原地,这一点非常重要。当然是IMO。
0赞 kotpal 7/23/2020
learn.microsoft.com/en-us/dotnet/csharp/language-reference/......

答:

3190赞 55 revs, 32 users 33%Peter Mortensen #1

C# 语言版本历史记录:

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

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

在回答OP的问题时:

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

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

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

评论

4赞 WLFree 10/6/2022
不确定该文件是何时发布的,但在 2022 年我们有链接
0赞 Guru Stron 12/12/2023
@WLFree它最初由Jon Skeet于2008年10月29日 17:10创建
330赞 3 revs, 2 users 56%Peter Mortensen #2

在处理 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 语法和功能。

99赞 8 revs, 8 users 27%Wai Ha Lee #3
版本 语言规范 Microsoft 编译器
C# 1.0/1.2 2001年12月/2003年? 2002年1月
C# 2.0 2005 年 9 月 2005年11月
C# 3.0 2006 年 5 月 2006年11月
C# 4.0 2009年3月(草案) 2010年4月
C# 5.0 2012 年 8 月随 .NET 4.5 一起发布
C# 6.0 随 .NET 4.6 2015 一起发布
C# 7.0 随 .NET 4.7 2017 发布
C# 8.0 随 .NET 4.8 2019 发布

评论

8赞 Jon Skeet 5/7/2010
2002 年 12 月,您从哪里获得 C# 2.0 语言规范?同样,2006 年 6 月的 C# 4?你确定你不是在谈论完全不同的ECMA版本吗?
4赞 Pramodh 5/7/2010
只需参考以下链接 en.wikipedia.org/wiki/C_Sharp_(programming_language)
222赞 9 revs, 9 users 36%Peter Mortensen #4
41赞 2 revs, 2 users 81%Gennady Vanin Геннадий Ванин #5

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

C# 1.2 对应于 .NET 1.1 和 VS 2003,也称为 Visual C# .NET 2003

但更进一步,Microsoft停止增加次要版本(在点之后)数字或使它们不为零,.但应该注意的是,对应于 .NET 3.5 的 C# 在 msdn.microsoft.com 中被命名为“Visual C# 2008 Service Pack 1”。0

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

C# 2.0Visual C# 2005 的同义词

C# 3.0 对应于(或者更准确地说,可以定位)到:

评论

2赞 Jon Skeet 3/1/2022
这个答案已经过时了——所有内容都已经包含在公认的答案中。我强烈建议您删除此答案。
58赞 3 revs, 2 users 91%Israel Ocbina #6

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

评论

0赞 AlainD 2/17/2021
对于 Visual Basic:en.wikipedia.org/wiki/Visual_Basic_.NET
1赞 Jon Skeet 3/1/2022
鉴于这个答案现在已经过时了,你有机会删除它吗?
480赞 28 revs, 12 users 65%nawfal #7

这与此处的大多数答案相同,但为了便于使用表格,并且为了完整起见,它具有 Visual Studio.NET 版本。

C# 版本 VS 版本 .NET 版本 CLR 版本 发布日期
1.0 2002 1.0 1.0 2002年2月
1.2 2003 1.1 1.1 2003年4月
2.0 2005 2.0 2.0 2005年11月
3.0 2.0 2006年11月
3.0 2008 3.5 2.0 2007年11月
4.0 2010 4.0 4 2010年4月
5.0 2012 4.5 4 2012年8月
2013 4.5.1 4 2013年10月
4.5.2 4 2014 年 5 月
6.0 2015 4.6 4 2015年7月
4.6.1 4 2015年11月
4.6.2 4 2016年8月
7.0 2017 2017年3月
4.7 4 2017 年 5 月
7.1 2017 (v15.3) 2017年8月
4.7.1 4 2017年10月
7.2 2017 (v15.5) 2017年12月
4.7.2 4 2018年4月
7.3 2017 (v15.7) 2018 年 5 月
8.0 2019 4.8 4 2019年4月
4.8.1 4 2022年8月

自 .NET Core 以来的版本

C# 版本 VS 版本 .NET 版本 发布日期 支持终止
2015 更新 3 .NET Core 1.0 2016年6月 胡, 2019
.NET Core 1.1 2016年11月 胡, 2019
7.0 2017 2017年3月
7.1 2017 (v15.3) .NET Core 2.0 2017年8月 2018年10月
7.3 2017 (v15.7) .NET Core 2.1 2018 年 5 月 2021年8月
.NET 核心 2.2.NET Core 2.2 2018年12月 2019年12月
8.0 2019 2019年4月
2019 (v16.3) .NET Core 3.0 2019年9月 2020年3月
2019 (v16.4) .NET Core 3.1 2019年12月 2022年12月
9 (†) 2019 (v16.8) .NET 5 2020年11月 2022 年 5 月
10 2022 .NET 6 2021年11月 2024年11月
11 2022 (17.4) .NET 7 2022年11月 2024 年 5 月
12 2022 (17.8) .NET 8 2023年11月 2026年11月

* - .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 发布节奏”。

† 版本控制方案从 C# 9 开始major.minormajor

评论

0赞 nawfal 2/25/2021
@Dai,我的回答中没有暗示 C# 8.0 与 .NET 4.8 相关联,事实上,除了少数功能外,从未要求某些编译器版本绝对需要某些 .NET 版本。甚至在 C# 8.0 之前也是如此。我的答案只是跟踪 VS、.NET 和 C# 版本的时间线。我最初的答案是在 .NET 完整框架的上下文中,直到它不复存在。可以看到表中没有其他 .NET Core 版本,因为我也没有费力地介绍它。编辑后,查看者将丢失有关 .NET 4.8 的信息。
0赞 nawfal 2/25/2021
请随时为 .NET Core 版本添加其他列。
0赞 nawfal 5/14/2021
@all,如果发布日期不匹配,请不要添加值。当我最初写这篇文章时,我并不打算将 .net 版本与每个编译器版本相关联。它只是各种 C# 相关版本的时间线。因此,您自然可以看到我省略了一些列值。这有助于我们更好地了解所有版本是一起制作的。
66赞 5 revs, 2 users 83%Mindless #8

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

请注意,ASP.NET 5 已更名为 ASP.NET Core 1.0,ASP.NET MVC 6 已更名为 ASP.NET Core 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

评论

1赞 Jon Skeet 1/4/2017
老实说,我不确定将 MVC 放在同一个表中是否有帮助......实际上,它只是在一个单独的发布时间表上。
0赞 Mindless 1/4/2017
@Jon 这是真的,只是在这里为任何可能需要它的人添加它,因为我确实试图找出 .NET 框架的相应发布日期,以便我更好地了解整个版本历史记录。
19赞 2 revs, 2 users 74%sayah imad #9

C# 1.0 - Visual Studio .NET 2002

  • 结构
  • 接口
  • 事件
  • 性能
  • 代表
  • 表达 式
  • 语句
  • 属性
  • 文字

C# 1.2 - Visual Studio .NET 2003

  • 在 foreach 中处置
  • foreach over string 专用化
  • C# 2 - Visual Studio 2005
  • 泛 型
  • 部分类型
  • 匿名方法
  • 迭代器
  • 可为 null 的类型
  • 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)Compiler-as-a-service (Roslyn)
  • 将静态类型成员导入命名空间
  • 异常筛选器
  • 在 catch/finally 块中等待
  • 自动属性初始值设定项
  • 仅 getter 属性的默认值
  • 表情体成员
  • Null 传播器(null 条件运算符,简洁的 null 检查)
  • 字符串插值
  • 运算符的名称
  • 字典初始值设定项

C# 7.0 - Visual Studio 2017

  • 输出变量
  • 模式匹配
  • 元组
  • 解构
  • 丢弃
  • 本地函数
  • 二进制文本
  • 数字分隔符
  • Ref 返回和局部变量
  • 通用异步返回类型
  • 更多表情型成员
  • 抛出表达式

C# 7.1 - Visual Studio 2017 版本 15.3C# 7.1 - Visual Studio 2017 version 15.3

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

C# 7.2 - Visual Studio 2017 版本 15.5C# 7.2 - Visual Studio 2017 version 15.5

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

C# 7.3 - Visual Studio 2017 版本 15.7C# 7.3 - Visual Studio 2017 version 15.7

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

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

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

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

5赞 2 revs, 2 users 73%Shivam Mishra #10

C# 8.0 是 C# 的最新版本。它仅在 .NET Core 3.x 及更高版本上受支持。许多最新功能需要 .NET Core 3.x 中引入的库和运行时功能。

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

C# language version with Target framework

源 - C# 语言版本控制

评论

2赞 Jon Skeet 3/1/2022
在这一点上,C# 8 是很久以前的事了。我建议删除此答案,因为它没有提供任何已接受答案中尚未提供的信息。
11赞 2 revs, 2 users 66%user12275552 #11
Version     .NET Framework     Visual Studio     Important Features

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

  • 基本功能

C# 2.0 .NET 框架 2.0 Visual Studio 2005

  • 泛 型
  • 部分类型
  • 匿名方法
  • 迭代器
  • 可为 null 的类型
  • 私人二传手(属性)
  • 方法组转换(委托)
  • 协方差和逆方差
  • 静态类

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

  • 隐式类型的局部变量
  • 对象和集合初始值设定项
  • 自动实现的属性
  • 匿名类型
  • 扩展方法
  • 查询表达式
  • Lambda 表达式
  • 表达式树
  • Partial 方法

C# 4.0 .NET Framework 4.0 Visual Studio 2010

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

C# 5.0 .NET 框架 4.5 Visual Studio 2012/2013

  • 异步功能
  • 来电者信息

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

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

C# 7.0 .NET Core 2.0 Visual Studio 2017

  • out 变量
  • 元组
  • 丢弃
  • 模式匹配
  • 本地函数
  • 通用异步返回类型
  • 数字文本语法改进

C# 8.0 .NET Core 3.0 Visual Studio 2019

  • Readonly 成员
  • 默认接口方法
  • 模式匹配增强功能:
    • 切换表达式
    • 属性模式
    • 元组模式
    • 位置模式
  • 使用声明
  • 静态局部函数
  • 一次性 ref 结构
  • 可为 null 的引用类型
  • 异步流
  • 异步一次性
  • 指数和范围
  • Null 合并赋值
  • 非托管构造类型
  • 嵌套表达式中的 Stackalloc
  • 增强插值逐字字符串
2赞 2 revs, 2 users 75%Amichai #12

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

由于我找不到任何最新的表格,在一个地方包含我需要的所有信息 - 我将 Microsoft 文档中的详细信息合并到我试图保留的简洁表格中,其中包含我正在寻找的内容。

可在此处获得:https://mantinband.github.io/dotnet-shmotnet/

我可能有一些错误或缺少信息,所以请随时在这里提出问题或做出贡献:https://github.com/mantinband/dotnet-shmotnet

先睹为快:

Enter image description here

2赞 3 revsAhmad A #13

您可以在 Microsoft 的参考中找到所有 C# 语言版本的列表。