无法将 '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;
但是,您应该考虑 d1
或 d2
为 null 的可能性 - 这在您的情况下不会发生,但在其他情况下可能会发生。您可能需要:
int? d3 = (int?) (d1 - d2)?.TotalDays;
如果 d1
或 d2
为 null
,则结果为 null
。当然,这是假设您使用的是 C# 6 - 否则 ?.
运算符不可用。
(您可以按照 user3185569 的建议在第一种情况下使用 GetValueOrDefault()
,但如果任一值为 null
,那将默默地使用空 TimeSpan
,感觉不太可能你想要什么。)
使用 long 并转换
long x
System.TimeSpan y= new TimeSpan(x);
下面的代码工作正常:
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
如果你确实期望 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;
但是,您应该考虑 d1
或 d2
为 null 的可能性 - 这在您的情况下不会发生,但在其他情况下可能会发生。您可能需要:
int? d3 = (int?) (d1 - d2)?.TotalDays;
如果 d1
或 d2
为 null
,则结果为 null
。当然,这是假设您使用的是 C# 6 - 否则 ?.
运算符不可用。
(您可以按照 user3185569 的建议在第一种情况下使用 GetValueOrDefault()
,但如果任一值为 null
,那将默默地使用空 TimeSpan
,感觉不太可能你想要什么。)
使用 long 并转换
long x
System.TimeSpan y= new TimeSpan(x);