我今天遇到了这个问题,不知道为什么C#编译器没有抛出错误。
Int32 x = 1; if (x == null) { Console.WriteLine("What the?"); }
我对x如何可能为null感到困惑。特别是由于此分配肯定会引发编译器错误:
Int32 x = null;
x是否有可能成为null,Microsoft是否只是决定不将此检查放入编译器,还是完全错过了?
更新:在弄乱编写本文的代码之后,突然编译器提出了警告,该表达式永远不会为真。现在我真的迷路了。我将对象放到一个类中,现在警告消失了,但出现了问题,值类型最终可能为空。
public class Test { public DateTime ADate = DateTime.Now; public Test () { Test test = new Test(); if (test.ADate == null) { Console.WriteLine("What the?"); } } }
这是合法的,因为运算符重载解析有一个唯一的最佳运算符可供选择。有一个==运算符,它需要两个可为null的int。int local可以转换为可为null的int。null文字可转换为可为null的int。因此,这是==运算符的合法用法,并且始终会导致错误。
同样,我们也允许您说“ if(x == 12.6)”,这也永远是假的。int local可以转换为双精度,字面量可以转换为双精度,并且显然它们永远不会相等。