web-dev-qa-db-ja.com

System.DateTime?対System.DateTime

ページのカレンダーコントロール(Ajaxツールキット:カレンダーエクステンダー)から日付値を読み取る必要があるコードを書いていました。

以下のコード:

DateTime newSelectedDate = myCalendarExtender.SelectedDate;

次のエラーが発生します:

Cannot implicitly convert type 'System.DateTime?' to 'System.DateTime'. An explicit conversion exists (are you missing a cast?)

ただし、キャストを挿入することで、コードを機能させることができます。

DateTime newSelectedDate = (DateTime)myCalendarExtender.SelectedDate; // works fine!

カレンダーコントロール(Ajaxツールキット)の 'SelectedDate'プロパティは、データ型を 'System.DateTime?'として記述します。 ...明らかに「?」これらすべてと関係があります。

データ型にこの記号(?)が含まれていると、正確にはどうなりますか?キャストせずに、 'SelectedDate'プロパティを 'DateTime'型の変数に直接適用できると思いました。

ありがとう

27
Dal

?タイプがnull可能であることを意味します。詳細については、例を参照してください。 [〜#〜] msdn [〜#〜]

Nullableは、値型をnullにできるようにする値型のコンパイラーサポートラッパーです。

DateTime値にアクセスするには、次の操作を行う必要があります。

DateTime? dateOrNull = myCalendarExtender.SelectedDate;
if (dateOrNull != null)
{
    DateTime newSelectedDate = dateOrNull.Value;
}
46
Marek

DateTime?Nullable<DateTime>と同じです。つまり、DateTime?のインスタンスには「NULL」を含めることができますが、DateTimeのインスタンスには含めることができません。 (これはすべての値に当てはまります。NET2.0以降の型。値型にNULLを含めることはできませんが、.NET 2.0以降では、null許容値型はNullable<T>構文(または?省略形)を介してサポートされます。

DateTimeの値を取得できますか?次のようにして、DateTimeに入れます。

DateTime? someNullableDate;
DateTime myDate;

if( someNullableDate.HasValue )
   myDate = someNullableDate.Value;

Nullableの値を取得するもう1つの簡潔な方法は、null融合演算子を使用することです。

DateTime myDate = someNullableDate?? default(DateTime);
21

はるかに優れたソリューションとIMOは、null許容クラスを持つすべての機能の中で最も優れています

DateTime newSelectedDate = myCalendarExtender.SelectedDate.GetValueOrDefault();
10
Chris Marisic

DateTimeは構造体であるため、CalendarコントロールはSelectedDateプロパティでNullable <DateTime>(C#の短縮形はDateTime?)を返します。 null値により、コントロールは「日付が選択されていません」状態になります。したがって、nullableを使用する前に、nullableに値があるかどうかを確認する必要があります。

 var nullable = myCalendarExtender.SelectedDate; 
 var newSelectedDate =(nullable.HasValue)? nullable.Value:SomeDefaultValue; 

編集:ジョシュのコメントのおかげでさらに簡潔に:

 var newSelectedDate = myCalendarExtender.SelectedDate ?? SomeDefaultValue; 

私はそれが好きです!

9
Travis Heseman

使用できますか? C#で非常に簡潔な方法でnull値を処理する演算子。 「nullでない場合はそれを使用し、それ以外の場合はデフォルト値を使用する」という概念を表現する短い方法については、Travisの回答に関する私のコメントを参照してください。どちらも同じことをします。

2
Josh