如何在.NET Framework,或NET8以前的项目中使用C# 12的新特性
前两天发了一篇关于模式匹配
的文章,链接地址,有小伙伴提到使用.NET6没法体验 C#新特性的疑问, 其实呢只要本地的SDK源代码编译器能支持到的情况下(直接下载VS2022或者VS的最新preview版本)
只需要做很小的改动就可以支持的.
.NET Framework 目前不直接支持 C# 12,因为 C# 12 是与 .NET 6 和更高版本一起发布的,而 .NET Framework 的最后一个版本是 4.8,之后就不再更新了。但是,你也可以通过一些方法间接使用 C# 12 的新特性,前提是这些特性在编译时不依赖于 .NET 6 或更高版本的基础类库的新特性。以下是实现这一目标的步骤:
更新 Visual Studio:确保你的 Visual Studio 至少更新到支持 C# 12 的版本。这通常意味着使用 Visual Studio 2022 的最新版本。
编辑项目文件:手动编辑你的 .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
版本实现的问题:
解决这个问题也很简单,项目中定义一个命名空间为System.Runtime.CompilerServices
的IsExternalInit
class即可:
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设置版本
如何在.NET Framework,或NET8以前的项目中使用C# 12的新特性的更多相关文章
- 安装使用Entity Framework Power Tool Bate4 (Code First)从已建好的数据自动生成项目中的对应Model(新手贴,望各位大侠给予指点)
从开始学习使用MVC以后,同时也开始接触EF,很多原理都不是太懂,只知道安装了EF以后,点击哪里可以生成数据库对应的Model,不用再自己手写Model.这里记录的就是如何从已建立好的数据库生成项目代 ...
- 08 Django REST Framework 解决前后端分离项目中的跨域问题
01-安装模块 pip install django-cors-headers 02-添加到INSTALL_APPS中 INSTALLED_APPS = ( ... 'corsheaders', .. ...
- 如何在 .Net Framework 4.0 项目上使用 OData?
最新的 Microsoft ASP.NET Web API 2.1 OData 5.1.0 已只能在 .Net Framework 4.5 的安装了,如果要在 VS2010的 .Net Framewo ...
- [转]如何在 .Net Framework 4.0 项目上使用 OData?
本文转自:http://www.cnblogs.com/fiozhao/p/3536469.html 最新的 Microsoft ASP.NET Web API 2.1 OData 5.1.0 已只能 ...
- 如何在 ETL 项目中统一管理上百个 SSIS 包的日志和包配置框架
一直准备写这么一篇有关 SSIS 日志系统的文章,但是发现很难一次写的很完整.因为这篇文章的内容可扩展的性太强,每多扩展一部分就意味着需要更多代码,示例和理论支撑.因此,我选择我觉得比较通用的 LOG ...
- Entity Framework 6 Code First新特性:支持存储过程
Entity Framework 6提供支持存储过程的新特性,本文具体演示Entity Framework 6 Code First的存储过程操作. Code First的插入/修改/删除存储过程 默 ...
- [Laravel-Swagger]如何在 Laravel 项目中使用 Swagger
如何在 Laravel 项目中使用 Swagger http://swagger.io/getting-started/ 安装依赖 swagger-php composer require zirco ...
- Ay.Framework.WPF 2.0建立项目到底有多快
2015-3-31 今天我已经优化了很多地方,让客户使用起来几乎是傻瓜式使用了,废话不多说,我们开始吧. 默认的我提供了一些图片,但是也只占用了8M多,2.0版本目前总共有45M左右大小,毕竟包含了f ...
- 精进不休 .NET 4.5 (12) - ADO.NET Entity Framework 6.0 新特性, WCF Data Services 5.6 新特性
[索引页][源码下载] 精进不休 .NET 4.5 (12) - ADO.NET Entity Framework 6.0 新特性, WCF Data Services 5.6 新特性 作者:weba ...
- Entity Framework 6新特性:全局性地自定义Code First约定
2012年12月11日,Entity Framework已经发布了Entity Framework 6 Alpha2,因项目需要,目前已使用了其中的两个特性,今天就来介绍一下第一个特性:全局性地自定义 ...
随机推荐
- 使用 TortoiseGit 时,报 Access denied 错误
当输入正确的密码时,总是报如下错误: 解决方法: 然后弹出如下对话框: 然后编辑本地配置文件: 然后将红色框的SSH配置改为绿色框的 HTTP配置,点击保存,确定. 然后再进行拉取源码,先输入用户名, ...
- 开源云原生平台对比 KubeSphere vs Rainbond
最近因为工作需要,需要找一个功能完善的云原生应用平台,经过自己筛选和朋友推荐,剩下 KubeSphere和Rainbond ,这两个产品都是基于 Kubernetes 之上构建的云原生应用平台,功能都 ...
- liquibase常用操作
1.概述 Liquibase是一个用于跟踪.管理和应用数据库变化的开源的数据库重构工具.它将所有数据库的变化(包括结构和数据)都保存在XML文件中,便于版本控制. 本文旨在将平时工作中常用的一些操作进 ...
- runliuv MSDN I TELL YOU
runliuv MSDN I TELL YOU 老站点:WIN SEVER ,VISUAL STUDIO 早期版本 老站点:https://msdn.itellyou.cn/ 新站点:最近的WIN10 ...
- java把时间戳转换成时间_(转)java时间与时间戳互转
java中时间精确到毫秒级,所以需求时间需要 除以1000 //将时间转换为时间戳 public static String dateToStamp(String s) throws Exceptio ...
- session 和 cookie 有什么区别?
a.存储位置不同:session 存储在服务器端:cookie 存储在浏览器端. b.安全性不同:cookie 安全性一般,在浏览器存储,可以被伪造和修改. c.容量和个数限制:cookie 有容量限 ...
- 3个线程分别交替输出xyz字符,输出10遍
一位群友分享的**公司面试题 3个线程分别交替输出xyz字符,输出10遍 public class XYZ implements Runnable { private static AtomicInt ...
- des加密,url编码,url解码,des解密 DES加解密及Wrong key size错误处理
des加密,url编码,url解码,des解密 DES加解密及Wrong key size错误处理 package com.example.core.mydemo.des; import javax. ...
- mongodb客户端操作语法笔记
##登录连接: 进入客户端方法D:\Program Files\MongoDB\Server\5.0\bin>mongo.exe > db.runoob.insert({"nam ...
- llm-universe - 1
Smiling & Weeping ---- 难怪春迟迟不来,原来是我把雪一读再读 一.大型语言模型(LLM)理论简介 1 大型语言模型(LLM)的概念 大语言模型(LLM,Large Lan ...