可以强制执行可为空的引用类型吗?
Possible to enforce nullable reference types?
如果 class 库是在启用 nullable reference types 的情况下编写的,开发人员可能不会总是检查 null
,因为编译器不会给出 warnings/errors.
在启用了可空引用类型的库中获取以下代码:
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);
是否有可能以某种方式强制(或至少警告)消费代码以启用可空引用类型?
这是不可能的,这是有充分理由的。如果它可以想象您向项目添加一个新库,它会迫使您更新数十万行代码。
由于可空性没有运行时影响,作为库作者,您应该始终在 public 接口中测试您的参数以验证无效输入。如果您验证 public 接口上的输入,则库内部可以安全地依赖可空性。
如果 class 库是在启用 nullable reference types 的情况下编写的,开发人员可能不会总是检查 null
,因为编译器不会给出 warnings/errors.
在启用了可空引用类型的库中获取以下代码:
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);
是否有可能以某种方式强制(或至少警告)消费代码以启用可空引用类型?
这是不可能的,这是有充分理由的。如果它可以想象您向项目添加一个新库,它会迫使您更新数十万行代码。
由于可空性没有运行时影响,作为库作者,您应该始终在 public 接口中测试您的参数以验证无效输入。如果您验证 public 接口上的输入,则库内部可以安全地依赖可空性。