2016-07-23 47 views
3

以下のコードは正常に動作する:暗黙的に 'System.TimeSpan?'を変換できません。 'のSystem.TimeSpan'

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

しかし、私はDateTimeDateTime?として定義した場合どのような:

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

がエラーと赤い下線

は暗黙的に変換できません。 'System.TimeSpan?' 'System.TimeSpan'

nullableと定義されている2つのdatetimesの間の日数の違いを得ることは可能ですか?

+0

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

答えて

9

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

それとも、前にC#6にバージョンを使用している場合:次に、あなたは別のアプローチを使用する必要があります-null」それ:しかし

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

は、あなたがd1またはd2のいずれかがnullである可能性を検討すべきである - あなたのケースでは発生しませんが、コ他の場合はuld。あなたはしたいことがあります。d1またはd2どちらかがnullであればnullの結果が得られます

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

。これはもちろんC#6を使用していることを前提としています。そうでなければ?.演算子は使用できません。

(user3185569により示唆されるようにあなたが最初のケースでGetValueOrDefault()を使用することができますが、どちらかの値が何をしたいことをそう感じnull、ある場合には黙って空TimeSpanを使用します。)

+1

'GetValueOrDefault()'の使用は、与えられたコードの合理的な最適化であり、nullableがnullでないことが知られている他のケースにも適用できますが(すべての最適化のように、それを使用しない場合は、それが与えるマイクロオプトを知ることよりも重要です。 –

3

はい、GetValueOrDefault()を使用して:直接TotalDaysというプロパティが含まれていません

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

d1 - d2リターンのNullableのTimeSpanを。値がNULL

た場合でも、GetValueOrDefault()を使用すると、あなたが本当にNull値を期待していない場合は、0日(どのような上記のアプローチ戻っ)とし、無効な操作を区別することをお勧めしTimeSpanオブジェクトを返し、0合計日数を取得することができます(日付 - ヌル)、(ヌル - 日付)および(ヌル - ヌル)。まあはい、しかし、あなた解除」にValueプロパティを使用する必要が

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

関連する問題