我今天遇到了这个问题,不知道为什么 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?");
}
}
}
最佳答案
这是合法的,因为运算符重载决策有一个唯一的最佳运算符可供选择。有一个 == 运算符,它接受两个可为 null 的整数。本地整数可转换为可为空的整数。 null 文字可转换为可为 null 的 int。因此,这是 == 运算符的合法用法,并且始终会导致 false。
同样,我们也允许您说“if (x == 12.6)”,这也始终为假。本地整数可转换为 double ,字面量可转换为 double ,显然它们永远不会相等。
关于C# 可以将值类型与 null 进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1972262/