前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C# 可空引用类型 Nullable 更强制的约束:将警告改为错误 WarningsAsErrors

C# 可空引用类型 Nullable 更强制的约束:将警告改为错误 WarningsAsErrors

作者头像
walterlv
发布于 2023-10-22 03:08:30
发布于 2023-10-22 03:08:30
4930
举报

程序员不看警告!

于是 C# 8.0 带来的可空引用类型由于默认以警告的形式出现,所以实际上约束力非常弱。

本文将把 C# 8.0 的可空引用类型警告提升为错误,以提高约束力。

启用可空引用类型

你需要先在你的项目中启用可空引用类型的支持,才能修改警告到错误:

项目属性

在项目属性中设置是比较快捷直观的方法。

在项目上右键属性,打开“生成”标签。

在这里,可以看到“将警告视为错误”一栏:

  • 所有
  • 特定警告

可以看到默认选中的是“特定警告”且值是 NU1605

NU 是 NuGet 中发生的错误或者警告的前缀,NU1605 是大家可能平时经常见到的一个编译错误“检测到包降级”。关于这个错误的信息可以阅读官网:NuGet Warning NU1605 - Microsoft Docs,本文不需要说明。

于是,我们将我们需要视为错误的错误代码补充到后面就可以,以分号分隔。

1

NU1605;CS8600;CS8602;CS8603;CS8604;CS8618;CS8625

这些值的含义可以参考我的另一篇博客:

记得在改之前,把前面的配置从“活动”改为“所有配置”,这样你就不用改完之后仅在 Debug 生效,完了还要去 Release 配置再改一遍。

WarningsAsErrors

前面使用属性面板指定时,有一个奇怪的默认值。实际上我们直接修改将固化这个默认值,这不利于将来项目跟随 Sdk 或者 NuGet 包的升级。

所以,最好我们能直接修改到项目文件,以便更精细地控制这个属性的值。

在上一节界面中设置实际上是生成了一个属性 WarningsAsErrors。那么我们现在修改 WarningsAsErrors 属性的值,使其拼接之前的值:

1 2 3 4 5 6 7 8 9 10 11

<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp3.0</TargetFramework> <LangVersion>latest</LangVersion> <Nullable>enable</Nullable> ++ <WarningsAsErrors>$(WarningsAsErrors);CS8600;CS8601;CS8602;CS8603;CS8604;CS8609;CS8610;CS8614;CS8616;CS8618;CS8619;CS8622;CS8625</WarningsAsErrors> </PropertyGroup> </Project>

这句话的含义是先获取之前的值,将其放到我们要设置的值的前面。这样可以跟随 Sdk 或者 NuGet 包的升级而更新此默认值。

这些值的含义可以参考我的另一篇博客:

参考资料

本文会经常更新,请阅读原文: https://blog.walterlv.com/post/warning-as-errors-for-csharp-nullable-reference-types.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://blog.walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 ([email protected])

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-04-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C# 8.0 如何在项目中开启可空引用类型的支持
C# 8.0 引入了可为空引用类型和不可为空引用类型。由于这是语法级别的支持,所以比传统的契约式编程具有更强的约束力。更容易帮助我们消灭 null 异常。
walterlv
2023/10/22
4900
C# 8.0 可空引用类型中的各项警告/错误的含义和示例代码
C# 8.0 引入了可为空引用类型和不可为空引用类型。当你需要给你或者团队更严格的要求时,可能需要定义这部分的警告和错误级别。
walterlv
2023/10/22
1.2K0
C# 8.0 可空引用类型中的各项警告/错误的含义和示例代码
VisualStudio 2019 尝试使用 C# 8.0 新的方式 可空类型Range异步的流
在安装了几天之后,终于有了 VisualStudio 2019 于是再安装了 dotnet core 3.0 预览版,现在可以来尝试使用 C# 8.0 的新方式
林德熙
2019/03/13
3.2K0
VisualStudio 2019 尝试使用 C# 8.0 新的方式
            可空类型Range异步的流
迫不及待地体验了一把 C#8.0 中的可空引用类型(Nullable Reference)
发布于 2017-12-18 21:41 更新于 2018-12-14 01:54
walterlv
2020/02/10
6500
如何在 csproj 中用 C# 代码写一个内联的编译任务 Task
我之前写过一些改变 MSBuild 编译过程的一些博客,包括利用 Microsoft.NET.Sdk 中各种自带的 Task 来执行各种各样的编译任务。更复杂的任务难以直接利用自带的 Task 实现,需要自己写 Task。
walterlv
2020/02/10
1.7K1
迫不及待地体验了一把 C#8.0 中的可空引用类型(Nullable Reference)
发布于 2017-12-18 13:41 更新于 2017-12-19 00:36
walterlv
2018/09/18
7730
迫不及待地体验了一把 C#8.0 中的可空引用类型(Nullable Reference)
dotnet 修复 C# 8.0 语法编译失败
在使用 using 等新语法时,在 VisualStudio 2019 会自动判断框架版本,如在 net 45 就不会自动使用最新版本的语法,需要修改项目文件
林德熙
2020/02/17
1.3K0
C# 在 8.0 对比 string 和 string? 的类型
在 C# 8.0 的时候提供了可空字符串的判断,但是可空字符串和字符串的类型是不是不同的?
林德熙
2019/03/13
7170
【译】尝试使用Nullable Reference Types
随着.NET Core 3.0 Preview 7的发布,C#8.0已被认为是“功能完整”的。这意味着它们的最大亮点Nullable Reference Types,在行为方面也被锁定在.NET Core版本中。它将在C#8.0之后继续改进,但现在可以认为它与C#8.0的其余部分一样是稳定的。
AI.NET 极客圈
2019/08/09
3.9K0
C#的Nullable 引用类型
在C# 8.0中,引入了Nullable引用类型这一特性,旨在提高应用程序的代码安全性和健壮性。通过使用可空引用类型,开发者可以更明确地表达出哪些引用类型变量可以为null,哪些不可以,从而减少空引用异常的风险。本文将深入探讨可空引用类型的核心概念、使用方式、最佳实践以及如何在现有代码中启用这一特性。
Michel_Rolle
2024/10/09
2.9K0
C# 8.0 中开启默认接口实现
当你升级到 C# 8.0 和 .NET Core 3.0 之后,你就可以开始使用默认接口实现的功能了。
walterlv
2023/10/22
3380
C# 8.0 中开启默认接口实现
制作通过 NuGet 分发的源代码包时,如果目标项目是 WPF 则会出现一些问题(探索篇,含解决方案)
在使用 NuGet 包来分发源代码时,如果目标项目是 WPF 项目,那么会有一大堆的问题。
walterlv
2023/10/22
5780
制作通过 NuGet 分发的源代码包时,如果目标项目是 WPF 则会出现一些问题(探索篇,含解决方案)
【译】C# 11 特性的早期预览
Visual Studio 17.1(Visual Studio 2022 Update 1)和 .NET SDK 6.0.200 包含 C# 11 的预览功能!您可以更新 Visual Studio 或下载最新的 .NET SDK 来获得这些功能。
郑子铭
2022/03/06
1.8K0
【译】C# 11 特性的早期预览
如何创建一个基于命令行工具的跨平台的 NuGet 工具包
发布于 2018-05-12 01:09 更新于 2018-09-01 00:16
walterlv
2018/09/18
1.1K0
如何创建一个基于命令行工具的跨平台的 NuGet 工具包
C# 8.0 的可空引用类型,不止是加个问号哦!你还有很多种不同的可空玩法
C# 8.0 引入了可空引用类型,你可以通过 ? 为字段、属性、方法参数、返回值等添加是否可为 null 的特性。
walterlv
2023/10/22
1.8K0
C# 8.0 的可空引用类型,不止是加个问号哦!你还有很多种不同的可空玩法
微软官方的 NuGet 包是如何做到同时兼容新旧框架的?例如 System.ValueTuple 是如何做到在新旧版本的框架都能使用的?
不知你是否好奇,System.ValueTuple 是新框架(.NET Core 3.0)开始引入的类型,但可以通过 NuGet 包向旧框架提供这些类型的使用。并且,这些包即便安装到本来就有此类型的新框架上也能正常运行而不会出现多处类型定义的问题。
walterlv
2023/10/22
5890
微软官方的 NuGet 包是如何做到同时兼容新旧框架的?例如 System.ValueTuple 是如何做到在新旧版本的框架都能使用的?
如何使用CsWhispers向C#项目添加DInvoke和间接系统调用方法
CsWhispers是一款针对C#编程项目的源代码生成工具,该工具基于C#开发,并且完全开源,可以帮助广大研究人员向已有的C#项目添加D/Invoke和间接系统调用方法源码。
FB客服
2024/04/15
4600
如何使用CsWhispers向C#项目添加DInvoke和间接系统调用方法
使用 C# 中的 dynamic 关键字调用类型方法时可能遇到的各种问题
你可以使用 dynamic 来定义一个变量或者字段,随后你可以像弱类型语言一样调用这个实例的各种方法,就像你一开始就知道这个类型的所有属性和方法一样。
walterlv
2023/10/22
9780
使用 C# 中的 dynamic 关键字调用类型方法时可能遇到的各种问题
C# 可为空引用类型
我对 C# 钟爱有加,我认为它严谨的语言设计非常棒。尽管如此,就目前而言,即使在 C# 版本 7 发布后,此语言也仍称不上完美。我这里指的是,尽管有理由期望 C# 会一直不断添加新功能,但遗憾的是,同时也存在着一些问题。
郑子铭
2023/08/29
4140
C# 可为空引用类型
C# 11 都有哪些新特性?
.NET 首席项目经理凯瑟琳在博客中介绍了 C# 11 的一些预览性新功能,这些功能可以在 Visual Studio 17.1 和 .NET SDK 6.0.200 中体验,下面摘录一部分新特性作介绍:
郑子铭
2023/12/13
3160
C# 11 都有哪些新特性?
推荐阅读
相关推荐
C# 8.0 如何在项目中开启可空引用类型的支持
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档