转:在.NET FX 4.8项目中使用C# 8/9/10的新语法

发布时间 2023-11-27 16:14:31作者: 81

在.NET FX 4.8项目中使用C# 8/9/10的新语法

 

受到某些特殊原因的限制,有时候.NET项目被锁死在.NET Framework 4.8,而无法升级到.NET 5等更高版本,导致代码中能够使用的C#语法最高只能支持到C# 7.3,而无法使用C# 8及更高版本的语法。

C# 8及更高版本引入了不少很有实用价值的新语法,能否在.NET版本被限制在4.8的情况下使用这些新语法特性呢?答案是:可以部分实现。

C# 8及更高版本的C#所引入的新语法,大体上可以分为两大类:需要.NET运行时支持的与不需要.NET运行时支持的。

对于前一种情况,在.NET版本没有升级的情况下,很显然是无法在老版本项目中使用的;但对于第二种情况,则是有可能实现的。

实现方法:在solution文件(*.sln)所在目录下,新建一个名为“Directory.Build.props”文件,文件内容为

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <LangVersion>latest</LangVersion>
  </PropertyGroup>
</Project>

这样就可以在.NET Framework 4.8项目中使用C# 8/9/10所引入的新语法了(但仅限于不需要新运行时支持的语法特性)。比如,可以使用:

  • using declaration
  • Static local functions
  • switch match pattern expression
  • Target-typed new expressions
  • lambda expression type inference
  • File Scoped Namespaces

其他一些语法也能够支持,但可能需要额外补充一些.NET 4.8缺失的类型,比如:

  • Init only setters
  • Index and Range

github上有个PolySharp项目,通过Source Generator自动补充新版本语法所需要的额外类型,我试了下,对于一般的C#项目是可用的,但对于包含WPF XAML代码文件的项目,编译时会报错,原因未知。此时,只能自行手动补充确实的类型的定义。