Dot-Net

.NET DateTime 中的空值是否保證小於實際值?

  • July 11, 2012

也許我的 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;
}

它似乎在我嘗試過的少數有限情況下有效(當然item.tstamp也聲明DateTime? tstamp了)。

這是有保證的行為嗎?

結論(?)

根據答案(以及 Jon Skeet 的 [對另一個問題的回答]),我進行了以下檢查:

if (item.tstamp != null &&
   (latest_tstamp == null || latest_tstamp < item.tstamp)){
   // do stuff
}

這是 C# 規範所保證的行為。<on 可空值類型的結果是false如果它們中的任何一個是null. 另一方面,引用類型可能表現出不同的行為。

我仍然不建議使用這個。很難理解這段程式碼。我更喜歡顯式null檢查,或者只是一個布爾標誌isFirstElement,而不是首先使用可空值。

7.2.7 吊運操作員

提升的運算符允許對不可為空的值類型進行操作的預定義和使用者定義的運算符也與這些類型的可空形式一起使用。提昇運算符由滿足某些要求的預定義和使用者定義的運算符構成,如下所述:

  • 對於關係運算

     <   >   <=   >=

符,如果操作數類型都是不可為空的值類型並且結果類型是 ,則存在運算符的提升形式bool。提升形式是通過向每個操作數類型添加單個?修飾符來構造的。**如果一個或兩個操作數是,則****提升的運算符產生值。false``null**否則,提升的運算符會展開操作數並應用底層運算符來生成bool結果。

(引自 C# 語言規範 3.0 版)

引用自:https://stackoverflow.com/questions/11437682