首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

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

编程知识
2024年07月20日 22:18

前两天发了一篇关于模式匹配的文章,链接地址,有小伙伴提到使用.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设置版本

最后请注意,即使通过这些方法,也不意味着早期的框架版本项目就能使用Nuget引用新版框架的dll库,比如NETFramework4.5引用NET8编译的dll版本,那肯定是不行的,除非该dll编译成了对应的框架版本支持

From:https://www.cnblogs.com/vipwan/p/18313947
本文地址: http://shuzixingkong.net/article/234
0评论
提交 加载更多评论
其他文章 keepalived
四、Keepalived 【1】、keepalived运行原理 Keepalived检测每个服务器接节点状态 服务器节点异常或出现工作故障,keepalived将故障节点从集群系统中剔除 故障节点恢复后,Keepalived再将其加入到集群系统中 所有工作自动完成,无需人工干预 keepalived
keepalived
同时使用线程本地变量以及对象缓存的问题
同时使用线程本地变量以及对象缓存的问题 如有转载请著名出处:https://www.cnblogs.com/funnyzpc/p/18313879 前面 前些时间看别人写的一段关于锁的(对象缓存+线程本地变量)的一段代码,这段代码大致描述了这么一个功能: 外部传入一个key,需要根据这个key去全局
同时使用线程本地变量以及对象缓存的问题 同时使用线程本地变量以及对象缓存的问题 同时使用线程本地变量以及对象缓存的问题
音频文件降噪及python示例
操作系统 :Windows 10_x64 Python版本:3.9.2 noisereduce版本:3.0.2 从事音频相关工作,大概率会碰到降噪问题,今天整理下之前学习音频文件降噪的笔记,并提供Audacity和python示例。 我将从以下几个方面展开: noisereduce库介绍 使用Aud
音频文件降噪及python示例 音频文件降噪及python示例 音频文件降噪及python示例
LLM并行训练6-激活优化
LLM训练activation优化相关技术, 包括激活重计算/序列并行/zero-R/zero-offload等
LLM并行训练6-激活优化 LLM并行训练6-激活优化 LLM并行训练6-激活优化
GIS前沿技术
无论是初步接触到GIS的学生,还是对GIS已经有一定的了解的从业者,肯定都非常关心两个问题:GIS有没有发展前景,GIS有哪些应用价值? 关于这两个问题,笔者的答案是GIS作为一门融合了空间数据采集、存储、处理、分析和可视化的学科,涉及到多个交叉领域和技术,因此非常容易与时下流行的前沿科技相结合,因
GIS前沿技术 GIS前沿技术 GIS前沿技术
Standard Template Libary or C++ Standard Library
C++提供一套标准的library称为C++ standard library完全以template完成,所以又被称为Standard Template Library。这套library专门有于实现常用的据结构(例如arry、list......)以及常用的算法(例如push,pop,insert
Windows11下使用VcXsrv+xfce4实现图形化窗口
通过 sudo apt-get install xfce4-terminal sudo apt-get install xfce4 sudo service dbus restart 来安装所需要的软件包,期初我也是按部就班的通过网上搜索到的教程进行操作,例如: sudo nano ~/.bashr
Windows11下使用VcXsrv+xfce4实现图形化窗口
暑假java自学进度总结02
一.今日所学: 1.配置环境变量 在系统内配置java路径后,再在path中 利用系统路径配置Java编译工具和运行工具路径。 2.下载并安装Natepad++,并且配置相关设置 3.初步了解了Java的发展历程,能干什么,为什么被广泛使用,以及跨平台原理。 4.学习了JDK,JRE,JVE之间的关
暑假java自学进度总结02