.Net6 生成的项目, 默认会启用 nullable 检查, 这样会大大避免 NullReferenceException 异常,
csproj 文件设置, 
  <PropertyGroup><TargetFramework>net6.0</TargetFramework><Nullable>enable</Nullable><ImplicitUsings>enable</ImplicitUsings></PropertyGroup>

Nullable 的取值有 enable/disable/warnings/annotations 4种, 4种类型涉及两个维度, 警告上下文和注解上下文的开启,

enable: 意义很明确, 启用最严格的方式, .net 6 默认方式.  即编译器对表达式推断和声明不符合, 将会报编译错误.

disable: 老项目默认方式, 即编译器不对nullable做任何推断, 也不会有任何警告.

warnings: 即关闭注解上下文, 仅仅开启警告上下文, 简单理解: 编译器不对引用类型变量做推断,  仅对值类型做简单推断, 违反nullable规则, 仅仅报 warning.

annotations: 编译器对引用类型变量自行推断, 但不做警告.

实际项目的问题:

问题1: 我们能确定赋值不会为null, 但编译器推断为空, 怎么调教编译器呢?

方案: 在代码中加上下面的方法即可.

ArgumentNullException.ThrowIfNull(keyValuePairs);

问题2:  [DisallowNull] 注解和 T 的区别, [AllowNull] 和  T? 和Nullable<T> 的区别:

[DisallowNull] string a1="a" ;   string a2="a";

上面代码在C#8是没有区别的,  [DisallowNull] 常用于泛型类定义.

[AllowNull] string a1="a" ;   string? a2="a";  Nullable<string> a3="a";

上面代码在C#8是没有区别的,  [AllowNull] 常用于泛型类定义.

问题3: 强制干预编译器赋null值

string a = null;     // warning
string b = null!;    // ok
string c = default!; // ok

问题4: 如何为老项目启用nullable检查

csproj文件中, 启用nullable检查,

然后先为每个cs文件加上下面的指令

#nullable disable

然后一个一个文件开启, 并修正代码.

=================================

参考

=================================

C# 8: Nullable Reference Types - Meziantou's blog

C# 8.0 如何在项目中开启可空引用类型的支持 - walterlv

可为空引用类型 | Microsoft Docs

C# 项目的 nullable 检查相关推荐

  1. [笔记]解决m2eclipse给项目添加maven依赖管理时可能不给项目的build path...

    为什么80%的码农都做不了架构师?>>>    解决办法:在m2eclipse提供的菜单里关闭项目的Maven依赖管理,然后再启动Maven的依赖管理!!! 检查:1)查看项目的.c ...

  2. 比尔盖茨是这样审查项目的 1

    比尔盖茨是这样审查项目的  1 --选自<软件随想录:程序员部落酋长Joel谈软件> 2006 年 6 月 16 日 ,星期五 早先, Excel[1] 有一种没有名字的很蹩脚的编程语言. ...

  3. 限定项目的 Node.js 版本

    限定项目的 Node.js 版本 限定项目运行所需的 Node.js 版本可保证项目在一个稳定可预期的环境中运行,减少不必要的故障.甚至有些依赖库只能工作于某些版本下.同时,不加以限制的话,在多人合作 ...

  4. python pytest_Python项目的pytest初始化

    Python项目的pytest初始化 2018-01-19 00:08:25 +08 字数:2310 标签: Python Test 为什么要写测试 ¶ Python是一种必须要写测试的语言. 和C/ ...

  5. 参与 Apache 顶级开源项目的 N 种方式,Apache Dubbo Samples SIG 成立!

    头图来源:https://opensource.guide/ 来源 | 阿里巴巴云原生公众号 ​ 只有贡献代码才算是参与开源项目社区贡献吗? 一说到参与开源项目贡献,一般大家的反应都是代码级别的贡献, ...

  6. 参与Apache顶级开源项目的N种方式,Apache Dubbo Samples SIG 成立!

    简介:一说到参与开源项目贡献,一般大家的反应都是代码级别的贡献,总觉得我的代码被社区合并了,我才算一个贡献者,这是一个常见的错误认知.其实,在一个开源社区中有非常多的角色是 non-code cont ...

  7. Web高效管理多个项目的SVN仓库

    转至:https://www.jianshu.com/p/a0af00642585 采用方案 Linux+Apache+Subversion+MySQL+JDK+Tomcat+Svnadmin 目录 ...

  8. 这是可用于下一个项目的React Native工具列表

    by Rajput Mehul 通过拉杰普特·梅胡尔(Rajput Mehul) 这是可用于下一个项目的React Native工具列表 (Here's a list of React Native ...

  9. Android项目的targetSDK=23,在低于Android6.0的部分测试机(类似华为)上运行时出现的系统权限问题...

    相信大家对Android6.0以上的动态权限已经有所了解,很多童鞋也已经跃跃欲试地将自己项目的targetSDK升级到了23及其以上,很不幸的是我也成为了其中一员,然而我还是图样图森破了,升级之后的问 ...

最新文章

  1. linux之sed命令n,N,d,D,p,P,h,H,g,G,x解析
  2. IDEA是否会嫌导jar包麻烦吗???赶快来学习maven吧,冲冲冲
  3. 3、HTML <a>标签(超链接)
  4. html5 打印api,HTML5的API(一)
  5. SDH与PDH的区别介绍
  6. Python多线程编程基础1:为什么要使用线程
  7. matlab 遗传算法 等式约束,关于MATLAB遗传算法工具箱不等式约束
  8. 2.同步(Synchronization)
  9. 云视频会议对初创公司的益处
  10. MATLAB二次规划和整数规划
  11. 同步助手 android 微信 表情包,微信表情轻松导,同步助手带你装逼带你飞
  12. c语言入门教程--1编译器
  13. 前端学习-----HTML
  14. UCSC_2bit基因组格式ToFASTA格式
  15. 将自己的数据制作成cityscape格式
  16. AOE网络-关键路径
  17. cf596B. Wilbur and Array
  18. 采购申请屏幕以及BAPI增强
  19. js数组遍历所有元素方法 总结
  20. php中网页生成图片的方式,类似长微博图片生成器

热门文章

  1. KAFKA-PHP环境搭建
  2. 4 多线程应用:数据库连接池
  3. ASP.NET实例:用C#制作艺术字
  4. sort函数详解(史上最完整QAQ)
  5. 学习分享 | 通过C++,python的对比,帮你快速入门python
  6. [从头学数学] 第180节 解三角形
  7. SpringBoot的基本配置
  8. IE 正式入土!网友祭出实体版墓碑...
  9. java命名规则与命名规范
  10. 【题库】OBCA认证考试(判断题)