2012-12-02 75 views
16

尋找更好的方法來比較可以爲空的日期時間比以下更多:比較可空的DateTime?

有什麼建議嗎?

// myobject.ExpireDatetime is of DateTime? 
// 
if (!myobject.ExpireDateTime.IsNull() && DateTime.Compare((DateTime)myobject.ExpireDateTime, DateTime.Now.ToUniversalTime()) < 0) 
{ //error! }  

編輯:對不起,混亂...... myobject.ExpireDatetime是 DateTime類型。

+0

在C#字**'object' **是一個關鍵字,它不能被用來作爲identifyer(除非你寫的'@object ')。我認爲目前還不清楚是否有一個可能爲空引用的盒裝「DateTime」,或者如果您有一個未裝箱的「真」可空「DateTime」('DateTime?')。 –

回答

24

你的問題是不太對我清楚,但如果我們哈已經

DateTime? ExpireDateTime; // could be a variable or a property 

它是確定他剛纔說

if (ExpireDateTime < DateTime.UtcNow) 
{ 
    ... 
} 

這將是確定的,如果ExpireDateTimenullHasValue是假的)。一些沒有經驗的開發商將很難理解lifted operators,所以要更清楚,你可以寫

if (ExpireDateTime < (DateTime?)DateTime.UtcNow) 
{ 
    ... 
} 

這是相同的,但更容易閱讀和理解。

從不.Value如果nullable可能爲空,當然。你會得到一個InvalidOperationException「可爲空的對象必須有一個值」如果你這樣做。

+0

太棒了!是的,這是我真正的解釋。也就是說,如果通過檢查值是否爲空,然後檢查可空值上的約束如果(val.isnotnull && val.iswithinconstraint) – JaJ

+2

但是,(默認( DateTime?) DateTime.UtcNow)也爲false – labroo

+1

@labroo當然。因此,對於可空字符串,我們沒有「[三分法](https://en.wikipedia.org/wiki/Trichotomy_(mathematics))」,所以有時「x y '都是'假'。 –

0

使用可空的Value屬性:

objet.ExpireDateTime.Value 

if (!object.ExpireDateTime.IsNull() 
    && DateTime.Compare(objet.ExpireDateTime.Value, 
         DateTime.Now.ToUniversalTime()) < 0) 
{ 
}  
+0

原始問題仍然存在一種異味(在通常的實現中)'System.Object'沒有一個名爲'ExpireDateTime'的靜態成員(所以它仍然不能編譯)。 –

+0

@JeppeStigNielsen - 'ExpireDateTime'可能是一種擴展方法。 – Oded

+0

@Oded你不能這樣擴展。即使使用擴展方法,您也需要在點('.')之前使用標識符或普通擴展名。例如'(new object()).ExpireDateTime()'或'typeof(object).ExpireDateTime()'或'@ object.ExpireDateTime()'都可以用一些(非常瘋狂的)擴展方法編譯。但是'對象'有問題。另外,如果它是一種方法,你不能只先說'.IsNull',而不先用_invoking_'ExpireDateTime'。總之,它永遠不會有效。 –

1

如果ExpireDateTimeNullable<DateTime>我會做以下代替:

if (ExpireDateTime.HasValue && ExpireDateTime < DateTime.Now.ToUniversalTime()) 
{ 
} 
+0

很酷謝謝! ... – JaJ

9

我會建議您使用以下:

int y = Nullable.Compare<DateTime>(DateTime.UtcNow, x); 

// x is the nullable date time object. 
// y will be '-1' if x is greater than DateTime.UtcNow