C# 是否可以强制执行可为空的引用类型?

C# 是否可以强制执行可为空的引用类型?,c#,.net-core,.net-core-3.0,c#-8.0,nullable-reference-types,C#,.net Core,.net Core 3.0,C# 8.0,Nullable Reference Types,如果类库是在启用状态下编写的,开发人员可能不会总是检查null,因为编译器不会给出警告/错误 在启用了可空引用类型的库中获取以下代码: 公共类1 { 公共void MyMethod(字符串s) { //不要检查null,因为编译器很高兴 s、 托洛尔(); } 公共无效MyMethod2(字符串?s) { //检查null,否则编译器将发出警告 如果(s!=null) { 这是我的方法; } } } 如果消费者调用Class1.MyMethod时未启用可为空的引用类型,则在进行以下调用时不会收

如果类库是在启用状态下编写的,开发人员可能不会总是检查
null
,因为编译器不会给出警告/错误

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

公共类1
{
公共void MyMethod(字符串s)
{
//不要检查null,因为编译器很高兴
s、 托洛尔();
}
公共无效MyMethod2(字符串?s)
{
//检查null,否则编译器将发出警告
如果(s!=null)
{
这是我的方法;
}
}
}
如果消费者调用
Class1.MyMethod
时未启用可为空的引用类型,则在进行以下调用时不会收到警告:

var c=newclass1();
c、 MyMethod(null);

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

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


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

使用NRT并不能免除您必须对参数(至少在公共API上)进行空检查的任务。NRT只是注释,故意增加获得至少可用而不是完美的内容的可能性。如果调用代码不知道NRT,它将得到与它们根本不存在一样的行为。实际上,没有一种切实可行的方法可以强制执行不同的行为,而不完全破坏向后兼容性,这将使该功能的实用性大大降低。通过
#可为空的警告
,可以自愿选择加入,但您不能让呼叫者尊重您的NRT,即使只是作为警告——这是出于设计。