.NET DateTime中的空值是否保证小于实际值?

Way*_*ner 16 .net nullable

也许我的Google-Fu让我失望了,但是我无法确定在.NET中比较一个可空的内容是否总是比其他内容少.

我有一些类似的代码

MyClass findLatest(List<MyClass> items){
    DateTime? latest_tstamp = null;
    MyClass latest_item = null;
    foreach(var item in items){
        if (latest_tstamp < item.tstamp){
            latest_tstamp = item.tstamp;
            latest_item = item;
        }
    }
    return latest_item;
}
Run Code Online (Sandbox Code Playgroud)

它似乎适用于我尝试的几个有限的案例(当然也item.tstamp被宣布DateTime? tstamp).

这是保证的行为吗?

结论(?)

根据答案(以及Jon Skeet的[另一个问题的答案]),我已经进行了以下检查:

if (item.tstamp != null &&
    (latest_tstamp == null || latest_tstamp < item.tstamp)){
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

Cod*_*aos 20

这是C#规范保证的行为.可以为<null的值类型的结果是,false如果它们中的任何一个是null.另一方面,引用类型可能表现出不同的行为.

我仍然不建议使用它.很难理解这段代码.我更喜欢显式null检查,或者只是一个布尔标志,isFirstElement而不是首先使用可空的.

7.2.7提升运营商

提升的运算符允许在非可空值类型上运行的预定义和用户定义的运算符也可以与这些类型的可空形式一起使用.提升运算符由满足特定要求的预定义和用户定义的运算符构成,如下所述:

...

  • 对于关系运算
         <   >   <=   >=
    符,如果操作数类型既是非可空值类型又是结果类型,则存在提升形式的运算符bool.通过向?每个操作数类型添加单个修饰符来构造提升形式.如果一个或两个操作数都是,则提升的运算符产生值.falsenull否则,提升的运算符会解包操作数并应用基础运算符来生成bool结果.

(引自C#语言规范版本3.0)


Luc*_*ero 6

从MSDN引用:

当您使用可空类型进行比较时,如果其中一个可空类型的值为null而另一个不是,则除了!=(不等于)之外,所有比较都会计算为false .重要的是不要假设因为特定比较返回false,相反的情况返回true.在以下示例中,10不大于,小于或等于null.仅num1 != num2 评估为true.

两个null为null的可空类型的相等比较计算结果为true.