"System.Nullable<System.TimeSpan>"没有定义"TotalMinutes"。

4

有没有一种优雅的方法可以避免这个错误,而不是在if()中检查.HasValue,然后添加Value,比如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'的定义。
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)
{
    ...
}

我猜我可能还是误解了...

非常好。 - Simon Whitehead
@Jon Skeet:谢了!确实更简洁。然而,我想用可空日期时间(entity.End)与现在进行比较,但只需要到分钟精度。使用AddMinutes(1)似乎不能得到正确的结果。还在继续尝试调整以使其正常工作。 - genxgeek
@JaJ:老实说,很难理解你想要实现什么。如果你在问题中提供更多细节和示例,那会非常有帮助。 - Jon Skeet
如果(entity.End > new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, 0).AddMinutes(1)) { } - user645280
@JonSkeet:你好Jon。我更新了原始的代码。基本上,我需要将可空日期时间与现在进行比较,但只需精确到分钟的时间(即忽略秒和毫秒)。 - genxgeek
@JaJ:好的 - 对我来说,可空部分似乎有些次要。不过请看我的编辑 - 希望能帮到你。 - Jon Skeet

2

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

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)
{
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接