首页 > 编程语言 >如何在.NET Framework,或NET8以前的项目中使用C# 12的新特性

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

时间:2024-07-20 23:17:53浏览次数:13  
标签:12 C# 特性 Framework 版本 NET

前两天发了一篇关于模式匹配的文章,链接地址,有小伙伴提到使用.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> 标签来实现。

<PropertyGroup>
  <LangVersion>12.0</LangVersion>
</PropertyGroup>

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

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

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

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

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

namespace System.Runtime.CompilerServices
{
    public static class IsExternalInit
    {
    }
}

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

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设置版本

标签:12,C#,特性,Framework,版本,NET
From: https://www.cnblogs.com/vipwan/p/18313947

相关文章

  • 从原点 *** 获取 *** 的访问已被 CORS 策略阻止:无“Access-Control-Allow-Origin” -
    我正在尝试将AuthADFS与Django应用程序和Angular集成,但我不断收到CORS错误。我尝试了一切,但似乎没有任何效果。AccesstoXMLHttpRequestat'https://login.microsoftonline.com/{your-tenant-id}/oauth2/v2.0/authorize?client_id={your-client-id}&response_type=......
  • docker部署Elasticsearch和Kibana
    1.Elasticsearch和Kibana介绍1.1什么是Elasticsearch?Elasticsearch是一个开源的分布式搜索和分析引擎,用于处理大规模数据的实时搜索、分析和存储。它构建在ApacheLucene搜索引擎库的基础上,提供了一个RESTfulAPI和易于使用的工具,使得在大数据量情况下进行搜索和分析变得高......
  • Oracle SQL:多字段组合去重技巧详解
    在Oracle数据库中,如果你需要根据多个字段的组合进行去重,最常用的几种方法是使用 DISTINCT 关键字、GROUPBY 子句,或者使用窗口函数 ROW_NUMBER()。1.使用 DISTINCT 关键字如果想要获取所有唯一的记录组合,可以使用 DISTINCT 关键字。这将返回指定列的唯一组合。SE......
  • Nginx系列-3 servername优先级和location优先级和常用正则表达式
    1.正则表达式和分组由于Nginx配置文件中经常出现正则表达式,因此本章节专门对常见的正则表达式进行简单介绍。[1]开始与结束^表示匹配输入字符串的开始$表示匹配输入字符串的结束[2]匹配次数?表示匹配0次或者1次+表示匹配1次或多次*表示匹配0从或多次{n}匹配n......
  • cimport 包装 C 库的 cython 模块
    我有这种C/cython项目:project/├──src/│└──modules/│├──cython1.pyx│├──cython1.pxd│├──cython2.pyx│├──cython2.pxd│├──includes/││├──c1.h││├──c1.c│......
  • SearchBar组件
    文章目录1.概念介绍2.使用方法3.代码与效果3.1示例代码3.2运行效果4.内容总结我们在上一章回中介绍了"Material3中的IconButton"相关的内容,本章回中将介绍SearchBar组件.闲话休提,让我们一起TalkFlutter吧。1.概念介绍我们在本章回中介绍的SearchBar是指......
  • 达梦数据库的系统视图v$dmwatcher
    达梦数据库的系统视图v$dmwatcher查询当前登录实例所对应的守护进程信息,注意一个守护进程可以同时守护多个组的实例,因此查询结果中部分字段(N_GROUP、SWITCH_COUNT)为守护进程的全局信息,并不是当前登录实例自身的守护信息。在DMDSC集群环境中,只显示控制守护进程的信息。另......
  • 一元二次方程c++题目
    描述利用公式x1=(-b+sqrt(b*b-4*a*c))/(2*a),x2=(-b-sqrt(b*b-4*a*c))/(2*a)求一元二次方程ax2+bx+c=0的根,其中a不等于0。输入输入一行,包含三个浮点数a,b,c(它们之间以一个空格分开),分别表示方程ax?+bx+c=0的系数。输出输出一行,表示方程的解。若b2=4*a*c,则两个实根相......
  • C#新语法
    要脑子有什么用,它只会想你。--zhu顶级语句(C#9.0)1、直接在C#文件中编写入口方法的代码,不用类,不用Main。经典写法仍然支持,可以反编译了解一下。2、同一个项目中只能有一个文件具有顶级语句。namespacep4_1{classProgram{staticvoidMain(string[]args)......
  • UE富文本框RichTextBlock的内容设置不同的字体颜色
    一、新建富文本样式行1.新建数据表 2.选择富文本样式行 二、添加样式 三、应用1.设置样式 2.包裹字体 四、效果展示 可根据自己的样式去包裹文本。......