【问题标题】:Nullable annotation context vs. nullable warnings context可空注释上下文与可空警告上下文
【发布时间】:2023-03-30 19:20:01
【问题描述】:

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

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

这是正确的思考方式吗?

【问题讨论】:

    标签: c# nullable-reference-types


    【解决方案1】:

    你说得很对。

    无警告的可空注释主要适用于希望为其使用者提供有用注释而无需更改代码以删除实现中的警告的库。出于这个原因,.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>

    【讨论】:

      猜你喜欢
      • 2013-11-15
      • 2017-01-16
      • 2015-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-08
      • 1970-01-01
      • 2022-07-07
      相关资源
      最近更新 更多