ページのカレンダーコントロール(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'型の変数に直接適用できると思いました。
ありがとう
?タイプがnull可能であることを意味します。詳細については、例を参照してください。 [〜#〜] msdn [〜#〜]
Nullableは、値型をnullにできるようにする値型のコンパイラーサポートラッパーです。
DateTime値にアクセスするには、次の操作を行う必要があります。
DateTime? dateOrNull = myCalendarExtender.SelectedDate;
if (dateOrNull != null)
{
DateTime newSelectedDate = dateOrNull.Value;
}
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);
はるかに優れたソリューションとIMOは、null許容クラスを持つすべての機能の中で最も優れています
DateTime newSelectedDate = myCalendarExtender.SelectedDate.GetValueOrDefault();
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;
私はそれが好きです!
使用できますか? C#で非常に簡潔な方法でnull値を処理する演算子。 「nullでない場合はそれを使用し、それ以外の場合はデフォルト値を使用する」という概念を表現する短い方法については、Travisの回答に関する私のコメントを参照してください。どちらも同じことをします。