【问题标题】:Possible to enforce nullable reference types?可以强制执行可为空的引用类型吗?
【发布时间】:2019-11-06 15:21:35
【问题描述】:

如果在编写类库时启用了nullable reference types,开发人员可能不会总是检查null,因为编译器不会给出警告/错误。

在启用了可为空引用类型的库中获取以下代码:

public class Class1
{
    public void MyMethod(string s)
    {
        // don't check for null as compiler is happy
        s.ToLower();
    }
    public void MyMethod2(string? s)
    {
        // check for null as compiler is warning otherwise
        if (s != null)
        {
            this.MyMethod(s);
        }
    }
}

如果消费者调用Class1.MyMethod 而不启用可为空的引用类型,他们在进行以下调用时不会收到警告:

var c = new Class1();
c.MyMethod(null);

是否有可能以某种方式强制(或至少警告)使用代码以启用可空引用类型?

【问题讨论】:

  • 使用 NRT 并不能让您不必对参数进行空值检查(至少在公共 API 上)
  • NRT 只是注释,故意增加获得至少可用的东西的几率,而不是完美的。如果调用代码不知道 NRT,它将获得与它们根本不存在相同的行为。在不完全破坏向后兼容性的情况下,没有切实可行的方法来强制执行不同的行为,这将使该功能的用处大大降低。使用 #nullable warnings 可以自愿选择加入,但您不能调用者尊重您的 NRT,即使只是作为警告 - 这是设计使然。

标签: c# .net-core .net-core-3.0 c#-8.0 nullable-reference-types


【解决方案1】:

这是不可能的。如果它可以想象您在项目中添加一个新库,它会迫使您更新数十万行代码。

由于可空性没有运行时影响,作为库作者,您应该始终在公共接口中测试您的参数以验证无效输入。如果您在公共接口上验证输入,则库内部可以安全地依赖可空性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 2020-04-19
    • 2018-08-20
    • 1970-01-01
    • 2011-03-10
    相关资源
    最近更新 更多