【发布时间】:2010-12-30 15:29:04
【问题描述】:
我今天遇到了这个问题,不知道为什么 C# 编译器没有抛出错误。
Int32 x = 1;
if (x == null)
{
Console.WriteLine("What the?");
}
我对 x 怎么可能为空感到困惑。特别是因为这个赋值肯定会引发编译器错误:
Int32 x = null;
x 是否有可能变为 null,是 Microsoft 只是决定不将此检查放入编译器,还是完全错过了?
更新:在写这篇文章的代码弄乱了之后,编译器突然提出了一个警告,即表达式永远不会为真。现在我真的迷路了。我将对象放入一个类中,现在警告已经消失,但留下了一个问题,值类型最终是否可以为 null。
public class Test
{
public DateTime ADate = DateTime.Now;
public Test ()
{
Test test = new Test();
if (test.ADate == null)
{
Console.WriteLine("What the?");
}
}
}
【问题讨论】:
-
你也可以写
if (1 == 2)。执行代码路径分析不是编译器的工作;这就是静态分析工具和单元测试的用途。 -
关于警告消失的原因,请参阅我的回答;不 - 它不能为空。
-
同意了(1 == 2),我比较好奇情况(1 == null)
-
感谢所有回复的人。现在一切都说得通了。
-
关于警告或无警告问题:如果所讨论的结构是所谓的“简单类型”,如
int,编译器会生成很好的警告。对于简单类型,==运算符由 C# 语言规范定义。对于其他(非简单类型)结构,编译器忘记发出警告。有关详细信息,请参阅Wrong compiler warning when comparing struct to null。对于非简单类型的结构,==运算符必须由该结构成员的opeartor ==方法重载(否则不允许使用==)。