以下のようなにDBから日付項目が取得できなかったら、呼び出し元に「取得できなかった」ことを知らせるためにnullを返そうとして怒られた。
public DateTime GetDBDate()
{
// DB取得
if (DBNull.Value.Equals(dr["date"]))
{
// ここでエラーになる
return null;
}
}
DateTimeは構造体のため、C#では値型として扱われる。
そのため、nullを設定することができない。
DateTimeでどうすればいいのか
じゃぁ、DateTime型でデフォルト値としてどう扱えばよいのか?
方法は3つある。
DateTimeのフィールド(MaxValue、MinValue)を使う
初期値はDateTimeのMaxValue、またはMinValueと決めて使う方法。
// MaxValue = 9999/12/31 23:59:59
return DateTime.MaxValue;
// MinValue = 0001/01/01 0:00:00
return DateTime.MinValue;
ただし、取得した側がMaxValueとMinValueのルールを知らなかった場合に、バグの素になってしまうため注意が必要。
DateTimeのコンストラクタで初期化する
// new DateTime(0) = 0001/01/01 0:00:00
return new DateTime(0);
DateTimeのフィールドを使うときと同じ注意が必要。Null許容型(Nullable)を使う
値型にNullをいれるときは、Null許容型を使う。
DateTime? dt;
dt = GetDBDate();
public DateTime? GetDBDate()
{
return null;
}
たぶんコレが一番しっくりくる。
もちろん呼び出し元のDateTimeの変数も、Null許容型にしなければならない。
参考
以上
written by @bc_rikko
Nullable < DateTime > nullDateTime;
返信削除or
DateTime? nullDateTime = null;
More info...Nullable DateTime
Ling