一尘不染

C#可以将值类型比较为null

c#

我今天遇到了这个问题,不知道为什么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?");
        }
    }
}

阅读 247

收藏
2020-05-19

共1个答案

一尘不染

这是合法的,因为运算符重载解析有一个唯一的最佳运算符可供选择。有一个==运算符,它需要两个可为null的int。int
local可以转换为可为null的int。null文字可转换为可为null的int。因此,这是==运算符的合法用法,并且始终会导致错误。

同样,我们也允许您说“ if(x == 12.6)”,这也永远是假的。int local可以转换为双精度,字面量可以转换为双精度,并且显然它们永远不会相等。

2020-05-19