2014/10/05

【C#】DateTimeにnullを入れるとエラーになる件

DateTimeにnullを入れようとすると、「Null 非許容の値型であるため、null を 'System.DateTime' に変換できません。」というエラーになる。

以下のようなに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

1 件のコメント :

  1. Nullable < DateTime > nullDateTime;
    or
    DateTime? nullDateTime = null;

    More info...Nullable DateTime

    Ling

    返信削除