如何在.NET Framework,或NET8以前的项目中使用C# 12的新特性

前两天发了一篇关于模式匹配的文章,链接地址,有小伙伴提到使用.NET6没法体验 C#新特性的疑问, 其实呢只要本地的SDK源代码编译器能支持到的情况下(直接下载VS2022或者VS的最新preview版本 )

只需要做很小的改动就可以支持的.

目前仍然还有一些小伙伴因为历史原因可能还在写.NET Framework项目,

.NET Framework 目前不直接支持 C# 12,因为 C# 12 是与 .NET 6 和更高版本一起发布的,而 .NET Framework 的最后一个版本是 4.8,之后就不再更新了。但是,你也可以通过一些方法间接使用 C# 12 的新特性,前提是这些特性在编译时不依赖于 .NET 6 或更高版本的基础类库的新特性。以下是实现这一目标的步骤:

  1. 更新 Visual Studio:确保你的 Visual Studio 至少更新到支持 C# 12 的版本。这通常意味着使用 Visual Studio 2022 的最新版本。

  2. 编辑项目文件:手动编辑你的 .csproj 文件,将 C# 语言版本设置为 12。这可以通过添加或修改 <LangVersion> 标签来实现。

xml 复制代码
<PropertyGroup>
  <LangVersion>12.0</LangVersion>
</PropertyGroup>

当然如果安装的VS2022的最新preview版本你还可以把版本号直接设置为latest以支持比12.0更高的语言版本

当然如果你的代码可能需要同时支持多个框架版本你可以使用预编译指令,以避免编译错误的问题

csharp 复制代码
#if NET8_0_OR_GREATER
// 使用 C# 12 的特性,这些特性依赖于 .NET8 或更高版本的基础类库
#else
// 提供 .NET Framework 兼容的代码
#endif

当设置LangVersion后,对于NET Framework项目如果使用record,init等关键字定义时应该还会报错会出现,这主要是因为兼容.NET Standard版本实现的问题:

解决这个问题也很简单,项目中定义一个命名空间为System.Runtime.CompilerServicesIsExternalInitclass即可:

csharp 复制代码
namespace System.Runtime.CompilerServices
{
    public static class IsExternalInit
    {
    }
}

下面创建一个项目测试一下,代码如下:

csharp 复制代码
namespace UseLatestLangVersion
{
    public class TestClass(string initWord)
    {
        public int Id { get; init; }
        public record User(string Name, int Age);
        public void SayHello()
        {
            Console.WriteLine(initWord);
            var user = new User("vipwan", 30);
            if (user is { Age: >= 18 })
            {
                Console.WriteLine($"user {user.Name} is adult.");
            }
        }
    }
}

以上的代码项目框架是.NET Framework4.5.2,用到了最新的一些C#特性,经过简单改造,就可以编译成功了.

最后重中之重就是本地SDK的csc编译器支持的最大版本一定要>=LangVersion设置版本

相关推荐
Flamesky20 天前
dotnet core微服务框架Jimu ~ 基础网关
微服务·c#·service·dotnet·csharp·micro·micro service
万雅虎1 个月前
使用Roslyn的源生成器生成DTO
roslyn·csharp·sg
万雅虎3 个月前
使用 `Roslyn` 分析器和修复器 对异步方法规范化返回Async结尾
netcore·roslyn·csharp·sg
万雅虎4 个月前
使用.NET源生成器(SG)生成项目的版本号信息
roslyn·csharp·sg
@背包4 个月前
C# 版本八大排序算法|.Net 架构
算法·排序算法·csharp
小康师兄5 个月前
IoTDB 入门教程 实战篇④——C#示例(开源)
开源·c#·时序数据库·iotdb·csharp
万雅虎5 个月前
C#中使用 record 的好处 因为好用所以推荐~
csharp
万雅虎5 个月前
C# 使用模式匹配的好处,因为好用所以推荐~
csharp
VAllen5 个月前
【一天一点.NET小知识】运用向量Vector<T>加速求和计算
c#·.net·.net core·dotnet·csharp