阅读了有关HNQ的问题之后,我继续阅读了有关C#8中的Nullable引用类型的信息,并进行了一些实验。
我非常清楚,有人说“我发现了编译器错误!”,十分之九,甚至更多。这实际上是设计使然,并对自己产生误解。而且,因为我直到今天才开始研究此功能,所以显然我对它没有很好的了解。这样处理后,让我们看下面的代码:
#nullable enable
class Program
{
static void Main()
{
var s = "";
var b = s == null; // If you comment this line out, the warning on the line below disappears
var i = s.Length; // warning CS8602: Dereference of a possibly null reference
}
}
阅读了上面链接的文档后,我希望该s == null
行向我发出警告-毕竟s
显然是不可为空的,因此将其与之比较null
是没有意义的。
相反,我在下一行收到警告,警告说这s
可能是空引用,即使对于人类来说,显然不是。
此外,如果不与进行比较,则不会显示警告。s
null
我做了一些谷歌搜索,然后遇到了一个GitHub问题,事实证明这完全是另外一回事,但是在此过程中,我与一名贡献者进行了交谈,对该行为提供了更多见解(例如,“空检查通常是一种有用的方法告诉编译器重置有关变量可为空性的先前推断。”)。但是,这仍然使我没有回答主要问题。
与其创建一个新的GitHub问题,而不是花大量时间来忙于项目贡献者,我将其发布给社区。
您能否解释一下发生了什么,为什么?特别是,为什么没有s == null
在线生成警告,为什么CS8602
在这里似乎没有null
参考的情况下我们会有 警告?如果可空性推断不是防弹的,如链接的GitHub线程所暗示的,它怎么会出错?那有什么例子呢?
?
因为s
它不能为空,所以不需要。它不会变为可为空,仅仅是因为我们足够愚蠢以将其与进行比较null
。