可空注释上下文与可空警告上下文
Nullable annotation context vs. nullable warnings context
Microsoft 的 documentation for nullable reference types 解释说,可为空的上下文是两个独立的二元区别的叉积:可以启用或禁用可为空的注释上下文,并且可以启用或禁用可为空的警告上下文。但是我无法理解为什么一个人可能启用了一个可为 null 的上下文而另一个禁用了。
我最好的解释是,这跟踪了生产者-消费者的区别。也就是说,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>
绝对是鼓励使用的设置。
Microsoft 的 documentation for nullable reference types 解释说,可为空的上下文是两个独立的二元区别的叉积:可以启用或禁用可为空的注释上下文,并且可以启用或禁用可为空的警告上下文。但是我无法理解为什么一个人可能启用了一个可为 null 的上下文而另一个禁用了。
我最好的解释是,这跟踪了生产者-消费者的区别。也就是说,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>
绝对是鼓励使用的设置。