2016-07-23 114 views
3

下面的代碼工作正常:不能隱式轉換'System.TimeSpan?'以 '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; 

紅色下劃線錯誤

無法隱式轉換「System.TimeSpan?到'System.TimeSpan'

是否有可能得到兩個日期時間之間的天數定義爲可空的差異?

+0

'INT D3 =( int)(d1.Value - d2.Value).TotalDays;' –

回答

9

嗯,是的,但你需要使用Value屬性設置爲「未-null」吧:

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

但是,你應該考慮的可能性,要麼d1d2爲空 - 這不會在你的情況發生,但合作在其他情況下。你可能想:

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

這將會給null如果任d1d2的結果是null。假設您使用C#6,否則?.運營商不可用。

(你可以在第一種情況下使用GetValueOrDefault()通過user3185569的建議,但會默默的用空TimeSpan如果任一值是null,感覺不太可能是你想要的。)

+1

使用'GetValueOrDefault()'是給出的代碼的合理優化,並且適用於其中可以爲空的其他情況(其中最常見的情況是在測試分支之後最常見的情況),但是像所有優化一樣,何時不使用它比知道它給出的微選更重要。 –

3

是,使用GetValueOrDefault()

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

d1 - d2回報可空時間跨度直接不含有一種叫TotalDays屬性。但是,使用GetValueOrDefault()你可以返回一個TimeSpan對象,並得到0總天數如果該值是NULL

如果你真的指望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?(); 
+0

這是一種整潔的代碼,但OP必須明白'null - null = 0'這可能不是真的。如果'null - null = null'可能會更好。 – Enigmativity

+0

@Enigmativity你是對的。但是我從OP瞭解到的日期是有效的,但只是定義爲'可空'。否則,區分0天差異和無效操作是非常有意義的。 – user3185569

相關問題