转:在.NET FX 4.8项目中使用C# 8/9/10的新语法
在.NET FX 4.8项目中使用C# 8/9/10的新语法
Innovative BIM techniques
受到某些特殊原因的限制,有时候.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代码文件的项目,编译时会报错,原因未知。此时,只能自行手动补充确实的类型的定义。