我今天碰到了这个,并且不知道为什么C#编译器没有抛出错误.
Int32 x = 1;
if (x == null)
{
    Console.WriteLine("What the?");
}
我很困惑x怎么可能是null.特别是因为这个赋值肯定会抛出编译器错误:
Int32 x = null;
是否有可能x变为null,微软是否决定不将此检查放入编译器,还是完全错过了?
更新:在编写了这篇文章的代码后,编译器突然发出一个警告,表达式永远不会成立.现在我真的迷路了.我把对象放到一个类中,现在警告已经消失,但是留下了问题,值类型最终是否为null.
public class Test
{
    public DateTime ADate = DateTime.Now;
    public Test ()
    {
        Test test = new Test();
        if (test.ADate == null)
        {
            Console.WriteLine("What the?");
        }
    }
}
可能重复:
C#可以将值类型与null进行比较
如果我尝试null在C#中分配一个不可为空的类型:
System.DateTime time = null;
我会得到一个编译时错误:
错误CS0037:无法将null转换为'System.DateTime',因为它是一个不可为空的值类型
这是有道理的.但如果比较相同的类型null:
System.DateTime time = obtainFromSomewhere();
if( time == null ) {
    //whatever;
}
没有编译时错误.这对我来说没有意义 - 如果我不能分配null那么为什么会这样null呢?
为什么我可以将非可空类型与null?进行比较?
我们刚刚在c#.net 4代码库中遇到了一些这样的错误代码
DateTime myDate = someValue;
If (myDate==Null)
    Do Something
我们发现这种情况永远不会发生.
编译器如何处理这些不可为空的结构比较?
最初我们感到惊讶的是它会编译......但是在你可以肯定有一个恒定的比较的点上合理化它:
If(1==2)
哪个也永远不会解决...但在这种情况下,编译器可以轻松地告诉它们是常量.它是否优化或汇总不可空的比较?
可能重复:
C#可以将值类型与null进行比较
使用TimeSpan考虑以下代码,TimeSpan是一个结构:
// will not compile - illegal
TimeSpan ts = null;  
但是,以下代码确实编译并且是合法的,尽管表达式始终为false:
if (ts == null)
    Console.WriteLine("this line will never be hit");
有人能告诉我为什么将结构设置为NULL是无效的,但可以将它与一个进行比较吗?