C# 语言版本与 .NET Framework、.NET Core(以及后来的 .NET 5+)的关系,可以概括为:语言版本是“需求方”,而 .NET 实现版本是“供给方”。 每一个 C# 版本都依赖于对应 .NET 版本提供的运行时功能和基础类库(BCL)支持。
它们之间的关系主要通过 目标框架 来绑定,编译器会根据项目的目标框架自动选择合适的默认 C# 版本。
C# 版本与 .NET 实现版本对应关系
下表整理了 C# 版本与 .NET Framework 及 .NET Core/5+ 的发布对应关系,可以清晰地看到这个演进过程。
请注意:表格中标*的 .NET Framework 4.8 对 C# 8.0 的支持存在特殊性。虽然技术上可以通过配置实现,但这并非官方推荐的做法,使用某些新特性可能会遇到运行时问题。
从上表可以得出两个核心结论:
-
分水岭:.NET Core 3.0 / C# 8.0:这是重要的分界线。从 C# 8.0 开始,许多新语言特性(如可空引用类型、异步流等)不再向后兼容 .NET Framework,其最低要求是 .NET Core 3.0 或 .NET Standard 2.1。
-
决定性因素: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.0 和 net8.0。这样可以保证在 .NET Framework 上的兼容性,同时也能为使用新 .NET 版本的应用提供更好的体验。