无法将 'System.TimeSpan?' 隐式转换为 'System.TimeSpan'

Cannot implicitly convert 'System.TimeSpan?' to 'System.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;

红色下划线有错误

Cannot implicitly convert 'System.TimeSpan?' to 'System.TimeSpan'

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

是,使用 GetValueOrDefault():

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

d1 - d2 return 不直接包含名为 TotalDays 的 属性 的 Nullable TimeSpan。但是使用 GetValueOrDefault() 你可以 return 一个 TimeSpan 对象并且如果值为 NULL

则得到 0 Total Days

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

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

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

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

嗯是的,不过你需要用到Value属性到"un-null"而已:

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

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

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

如果 d1d2null,则结果为 null。当然,这是假设您使用的是 C# 6 - 否则 ?. 运算符不可用。

(您可以按照 user3185569 的建议在第一种情况下使用 GetValueOrDefault(),但如果任一值为 null,那将默默地使用空 TimeSpan,感觉不太可能你想要什么。)

使用 long 并转换

long x
System.TimeSpan y= new TimeSpan(x);