淡若轻风

博客园 首页 新随笔 联系 订阅 管理

C# 语言版本与 .NET Framework、.NET Core(以及后来的 .NET 5+)的关系,可以概括为:语言版本是“需求方”,而 .NET 实现版本是“供给方”。 每一个 C# 版本都依赖于对应 .NET 版本提供的运行时功能和基础类库(BCL)支持。

它们之间的关系主要通过 目标框架 来绑定,编译器会根据项目的目标框架自动选择合适的默认 C# 版本

 

C# 版本与 .NET 实现版本对应关系

下表整理了 C# 版本与 .NET Framework 及 .NET Core/5+ 的发布对应关系,可以清晰地看到这个演进过程

 
C# 语言版本主要新增功能(示例).NET Framework 版本.NET Core / .NET 5+ 版本
C# 1.0 类、委托 .NET Framework 1.0 -
C# 2.0 泛型、可空类型 .NET Framework 2.0 -
C# 3.0 LINQ、Lambda 表达式 .NET Framework 3.5 -
C# 4.0 dynamic 类型 .NET Framework 4.0 -
C# 5.0 async / await .NET Framework 4.5 -
C# 6.0 字符串插值、nameof .NET Framework 4.6 .NET Core 1.0
C# 7.0 元组、模式匹配 .NET Framework 4.6.2 -
C# 7.1-7.3 default 字面量、ref struct .NET Framework 4.7 - 4.8 .NET Core 2.x
C# 8.0 可空引用类型、异步流 .NET Framework 4.8* .NET Core 3.0 / 3.1
C# 9.0 记录(record)类型、init 访问器 - .NET 5
C# 10.0 文件范围命名空间、全局 using - .NET 6
C# 11.0 泛型特性、原始字符串字面量 - .NET 7
C# 12.0 集合表达式、主构造函数 - .NET 8

请注意:表格中标*的 .NET Framework 4.8 对 C# 8.0 的支持存在特殊性。虽然技术上可以通过配置实现,但这并非官方推荐的做法,使用某些新特性可能会遇到运行时问题。

从上表可以得出两个核心结论:

  1. 分水岭:.NET Core 3.0 / C# 8.0:这是重要的分界线。从 C# 8.0 开始,许多新语言特性(如可空引用类型、异步流等)不再向后兼容 .NET Framework,其最低要求是 .NET Core 3.0 或 .NET Standard 2.1

  2. 决定性因素:C# 语言特性能用到哪个版本,完全取决于项目所选的目标框架(Target Framework)。例如,面向 .NET Framework 4.8 的项目,其默认 C# 语言版本被限制为 C# 7.3。而一个面向 .NET 8 的项目,则默认可以使用 C# 12.0

🧩 链接二者的桥梁:.NET Standard

为了理解为何有些新特性无法在 .NET Framework 上使用,需要了解 .NET Standard 的概念。

.NET Standard 是一套所有 .NET 实现都必须遵守的 API 规范(相当于一个“接口”)。它的目的是确保你的代码库可以在不同 .NET 实现上运行。

它如何影响 C# 版本?
一个 C# 语言特性(如 async/await)如果依赖了某个新的 API(如 System.Threading.Tasks.Task),而该 API 在 .NET Standard 2.0 中不存在,那么就无法在仅支持 .NET Standard 2.0 的 .NET Framework 上使用。

因此:

  • 实现跨平台共享:如果你的库需要同时在 .NET Framework 和 .NET Core 上运行,就应该面向 .NET Standard 2.0,此时能使用的 C# 版本被限制为 7.3

  • 拥抱新特性:从 .NET 5 开始,微软改变了策略,不再推出新版本的 .NET Standard,而是将 .NET 本身作为一个统一的平台。如果想使用 C# 9.0 及更高版本的新特性,就需要直接面向 .NET 5 或更高版本,这通常意味着你放弃了 .NET Framework 作为运行平台

💎 总结与建议

理解这些关系对项目决策至关重要:

  • 维持旧项目:如果项目基于 .NET Framework,C# 7.3 及更早版本的特性通常是最安全、兼容性最好的选择。

  • 开发新项目:强烈建议直接选择 .NET 6 或更高版本(LTS版本)。这不仅能让你使用最新的 C# 语言特性,还能获得更好的性能和跨平台支持

  • 开发可复用库:如果需要最大范围地覆盖用户,可以同时面向多个目标框架,例如 netstandard2.0net8.0。这样可以保证在 .NET Framework 上的兼容性,同时也能为使用新 .NET 版本的应用提供更好的体验

 
posted on 2026-07-19 16:47  淡若轻风  阅读(1)  评论(0)    收藏  举报