在低版本的NetFramwork使用高级版本的C#语法
2024年7月4日大约 3 分钟
简介
受到某些原因的限制,有时候.NET项目被锁死在.NET Framework 4.8以下,导致代码中能够使用的C#语法最高只能支持到C# 7.3,我想使用更高级版本的语法,但又考虑到可能有兼容性问题,怕会报各种莫名奇妙的错误,所以折腾一下,看看有没有能用的语法,本文总结一下升级的方法和自己试验的,一些常用的并且可用的语法。
C# 8及更高版本的C#所引入的新语法,大体上可以分为两大类:
需要.NET运行时支持的
不需要.NET运行时支持的。
对于第一种情况,在.NET目标架构没有升级的情况下,很显然是无法在老版本项目中使用的;
对于第二种情况,不需要运行时支持的,就是一个语法糖,在编译期间就能完成的,可能需要编译器的支持,比如要把IDE升级到Visual Stdio 2022等。这种类型的语法,可以部分使用
使用C#高版本语法的方法
1.修改单个项目的C#版本
直接编辑每个csproject项目文件,写上
<LangVersion>10.0</LangVersion>
2.修改整个解决方案的C#版本
在solution文件(*.sln
)所在目录下,新建一个名为“Directory.Build.props
”文件,文件内容为
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<LangVersion>10.0</LangVersion>
</PropertyGroup>
</Project>
试验可用的一些语法
虽然能使用高级语法,但并不是所有语法都能无脑使用,只能使用一些不需要运行时支持的语法糖,以下是我目前自己在使用的高级语法:
1. C#8.0版本的using声明
对于实现了IDisposable接口的类,都可以用using语法来回收资源,低版本的写法是
using (var services = new Services())
{
// ...
}
每个using后面都要跟上大括号,对于多重嵌套的using,代码看起来就很丑,使用高级语法之后就可以直接写成:
using var services = new Services();
用编译之后用ILSpy查看代码,其实就是上面带有括号的写法,只是编译器帮我们加上大括号,这样代码看起来会更简洁。
2.C#8.0的switch表达式
switch的正常写法:
public string test(int i)
{
switch (i)
{
case 0:
return "case 0";
case 1:
return "case 1";
default:
return "default";
}
}
用匹配模式的语法代码如下:
public string test(int i)
{
return i switch
{
0 => "case 0",
1 => "case 1",
_ => "default",
};
}"),
};
3.C#8.0的静态本地方法
4.C#9.0的类型推导new
Target-typed new expressions - C# feature specifications | Microsoft Learn