2012-12-02 74 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