无法隐式转换'System.TimeSpan?'到'System.TimeSpan'

时间:2016-07-23 12:28:54

标签: c# datetime asp.net-mvc-5 timespan

以下代码可以正常使用:

DateTime d1 = DateTime.Now;
DateTime d2 = DateTime.Now.AddDays(-1);
int d3 = (int)(d1 - d2).TotalDays;

但如果我将DateTime定义为DateTime?

,该怎么办?
DateTime? d1 = DateTime.Now;
DateTime? d2 = DateTime.Now.AddDays(-1);
int d3 = (int)(d1 - d2).TotalDays;

带红色的下划线

  

无法隐式转换'System.TimeSpan?'到'System.TimeSpan'

是否可以获得定义为可空的两个日期时间之间的天数差异?

2 个答案:

答案 0 :(得分:10)

是的,但你需要使用Value属性来“取消”它:

int d3 = (int)(d1 - d2).Value.TotalDays;

但是,您应该考虑d1d2为空的可能性 - 在您的情况下不会发生,但在其他情况下可能会发生。你可能想要:

int? d3 = (int?) (d1 - d2)?.TotalDays;

如果nulld1d2,则结果为null。这假设您正在使用C#6 - 否则?.运算符不可用。

(您可以按照user3185569的建议在第一种情况下使用GetValueOrDefault(),但如果值为TimeSpan,则会默默使用空null,这感觉不太可能是您的想。)

答案 1 :(得分:4)

是的,使用GetValueOrDefault()

DateTime? d1 = DateTime.Now;
DateTime? d2 = DateTime.Now.AddDays(-1);
int d3 = (int)(d1 - d2).GetValueOrDefault().TotalDays;

d1 - d2返回Nullable TimeSpan,它不直接包含名为TotalDays的属性。但是使用GetValueOrDefault(),您可以返回TimeSpan个对象,如果值为NULL,则获得0天总数

如果你确实期望Null值,最好区分0天(上述方法返回的内容)和无效操作(date - null),(null - date)和(null - null )。那么您可能需要使用另一种方法:

int? d3 = (int) (d1 - d2)?.TotalDays;

或者,如果您使用的是C#6之前的版本:

int? d3 = d1.HasValue && d2.HasValue ? (int)(d1 - d2).Value.TotalDays : new int?();