简介

受到某些原因的限制,有时候.NET项目被锁死在.NET Framework 4.8以下,导致代码中能够使用的C#语法最高只能支持到C# 7.3,我想使用更高级版本的语法,但又考虑到可能有兼容性问题,怕会报各种莫名奇妙的错误,所以折腾一下,看看有没有能用的语法,本文总结一下升级的方法和自己试验的,一些常用的并且可用的语法。

C# 8及更高版本的C#所引入的新语法,大体上可以分为两大类:

  1. 需要.NET运行时支持
  2. 不需要.NET运行时支持的。

对于第一种情况,在.NET目标架构没有升级的情况下,很显然是无法在老版本项目中使用的;

对于第二种情况,不需要运行时支持的,就是一个语法糖,在编译期间就能完成的,可能需要编译器的支持,比如要把IDE升级到Visual Stdio 2022等。这种类型的语法,可以部分使用

使用C#高版本语法的方法

参考:配置语言版本 - C# reference | Microsoft Learn

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声明

using 语句 - 确保正确使用可释放对象 - C# reference | Microsoft Learn

对于实现了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的静态本地方法

本地函数 - C# | Microsoft Learn

4.C#9.0的类型推导new

Target-typed new expressions - C# feature specifications | Microsoft Learn

C#11的原始字符串字面量

原始字符串字面量