4

是否有解决此错误的优雅方法,而不是在 if() 中检查 .HasValue 然后添加诸如 DateTimeUtcNow.Value 之类的值?

// Compare nullable date time entity.End with utcnow but only compare up to minute precision
// for time.
//
if ((int)(entity.End - DateTime.UtcNow).TotalMinutes < 0) 
{
   // ASSERT: entity.End < UTCNow (i.e. 12/4/2012 3:56 PM < 12/4/2012 3:57 PM) 
}

错误:System.Nullable' 不包含 'TotalMinutes' 的定义

4

2 回答 2

6

我个人会这样写:

if (entity.End > DateTime.Now.AddMinutes(1))
{
    ...
}

entity.End如果为空,则该条件将为假。

我经常发现,与其将一个日期/时间与另一个日期/时间进行比较,并将其与一个TimeSpan(或您正在使用的任何类型)进行比较,计算下限或上限并将其与变量日期/时间进行比较更清楚。在这种情况下,它肯定会很干净。

编辑:好的,现在问题更清楚,我将其写为:

DateTime now = DateTime.UtcNow;
DateTime lowerBound = new DateTime(now.Year, now.Month, now.Hour, now.Minute,
                                   0, 0, DateTimeKind.Utc);
DateTime upperBound = now.AddMinutes(1);
if (entity.End >= lowerBound && entity.End < upperBound)
{
    ...
}

我怀疑我可能仍然误解了...

于 2012-12-04T21:33:24.823 回答
2

一种选择是创建一个扩展方法来访问可为空的值并传播空值:

public static TOut? Select<T, TOut>(this T? nullable, Func<T, TOut> func) 
    where T : struct 
    where TOut : struct
{
    return nullable.HasValue ? (TOut?)func(nullable.Value) : null;
}

那么你可以这样做:

if ((entity.End - DateTime.UtcNow).Select(t => t.TotalMinutes) > 1)
{
}
于 2012-12-04T21:59:09.720 回答