可空注释上下文与可空警告上下文

问题描述

Microsoft的documentation for nullable reference types解释说,可为空的上下文是两个独立的二进制区别的叉积:可为空的注释上下文可以启用或禁用,可为空的警告上下文可以启用或禁用。但是我很难理解为什么一个可能启用了一个可为空的上下文而另一个禁用了。

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

这是思考的正确方法吗?

解决方法

您几乎完全正确。

没有警告的可空注释主要用于那些希望为其使用者提供有用注释而不必进行代码更改以删除实现中的警告的库。因此,.NET Core标准库中的几个项目都使用<Nullable>annotations</Nullable>设置。例如:https://github.com/dotnet/runtime/blob/254ef0f7f7f429ec238735fe6132805e3c38a19f/src/libraries/Microsoft.Extensions.Logging.Console/src/Microsoft.Extensions.Logging.Console.csproj#L7

不带注释的可空警告适用于维护人员不希望对其类型进行注释或更改编码模式以删除可空警告的项目,但是如果编译器发现某些错误,他们希望获得一些基本的可空警告肯定是错的。例如

#nullable enable warnings

Widget x = null; // no warning. Type 'Widget' has oblivious nullability here.
if (HasWidget)
{
    x = GetWidget();
}
Console.WriteLine(x.Id); // however,'x' has a maybe-null state here,so this is a warning

但是,鼓励使用的设置肯定只是项目中的<Nullable>enable</Nullable>