C# 可为空的注释上下文与可为空的警告上下文

C# 可为空的注释上下文与可为空的警告上下文,c#,nullable-reference-types,C#,Nullable Reference Types,Microsoft解释说,可空上下文是两个独立二进制区别的交叉产物:可空注释上下文可以启用或禁用,可空警告上下文可以启用或禁用。但是我很难理解为什么一个可以启用一个空上下文,而另一个可以禁用 我最好的解释是,这跟踪生产者和消费者的区别。也就是说,X中启用的注释上下文允许Y(使用X)在Y的启用的警告上下文中具有有意义的警告。或者换言之,如果我想改进代码用户的警告(无论是我自己代码的另一部分中的我还是使用我创建的库的另一个人),我应该启用注释上下文,如果我想确保对他人创建的代码进行适当检查,我应该启

Microsoft解释说,可空上下文是两个独立二进制区别的交叉产物:可空注释上下文可以启用或禁用,可空警告上下文可以启用或禁用。但是我很难理解为什么一个可以启用一个空上下文,而另一个可以禁用

我最好的解释是,这跟踪生产者和消费者的区别。也就是说,X中启用的注释上下文允许Y(使用X)在Y的启用的警告上下文中具有有意义的警告。或者换言之,如果我想改进代码用户的警告(无论是我自己代码的另一部分中的我还是使用我创建的库的另一个人),我应该启用注释上下文,如果我想确保对他人创建的代码进行适当检查,我应该启用警告上下文,该代码是否已正确注释。当然,理想情况下,一个人可能应该同时做这两件事,但一个人可能会优先考虑其中之一


这是正确的思考方式吗?

你说得很对

不带警告的可空注释主要针对那些希望为其使用者提供有用注释的库,而无需更改代码以删除实现中的警告。由于这个原因,.NET核心标准库中的几个项目使用了
注释
设置。例如:

不带注释的可空警告适用于那些维护人员对注释其类型或更改编码模式以删除可空警告不感兴趣的项目,但如果编译器发现某些明显错误,他们希望获得一些基本的可空警告。e、 g

#可为空的启用警告
小部件x=null;//没有警告。类型“Widget”在这里具有不可忽略的空性。
if(HasWidget)
{
x=GetWidget();
}
Console.WriteLine(x.Id);//但是,“x”在这里可能有一个空状态,因此这是一个警告
但是,鼓励使用的设置肯定只是项目中的
enable