本記事でわかる事
datetime? を datetime に変換する方法
datetime?をdatetimeに変換する方法
こんなコンパイルエラーが出る
おそらくこんなコンパイルエラーが発生してお悩みだと思います。
'System.DateTime?' を 'System.DateTime' に暗黙的に変換できません。明示的な変換が存在します(castが不足していないかどうか確認してください)
簡単に回避する方法があるので紹介します。
'System.DateTime?' を 'System.DateTime' に暗黙的に変換できません。を解決する方法
いくつか解決する方法があるので紹介していきます。
解決法 - その1 |null合体演算子を使った方法
ソースコード
1 2 3 4 | DateTime? dateTime1 = new DateTime(2020, 2, 25); // 2020年2月26日 // DateTime dateTime2 = dateTime1; // これだとコンパイルエラー発生 DateTime dateTime2 = dateTime1 ?? new DateTime(2020, 2, 26); |
ポイントは「??」。
「??」null合体演算子というものです。
1 | DateTime dateTime2 = dateTime1 ?? new DateTime(2020, 2, 26); |
- 左辺の「dateTime1」が null じゃなかったら、左辺を返す
- 左辺の「dateTime1」が null だったら、右辺を返す
というもの。
こういうコードを書き、ブレイクを貼りデバッグしてみるとイメージつかめると思います。
1 2 3 4 5 6 7 8 | DateTime? dateTime1 = new DateTime(2020, 2, 25); // 2020年2月26日 // DateTime dateTime2 = dateTime1; // これだとコンパイルエラー発生 DateTime dateTime2 = dateTime1 ?? new DateTime(2020, 2, 26); dateTime1 = null; DateTime dateTime3 = dateTime1 ?? new DateTime(2020, 2, 26); |
解決法 - その2|キャスト(型変換)する
ソースコード
1 2 3 | DateTime? dateTime1 = new DateTime(2020, 2, 25); // 2020年2月26日 DateTime dateTime2 = (DateTime)dateTime1; |
とくに解説不要、コードのままです。
ただし、気を付けないと例外発生します。以下の通りです。
1 2 3 4 5 6 7 | DateTime? dateTime1 = new DateTime(2020, 2, 25); // 2020年2月26日 DateTime dateTime2 = (DateTime)dateTime1; // ここは正常に動作する dateTime1 = null; DateTime dateTime3 = (DateTime)dateTime1; // 例外発生!! |
こんな例外が発生するよ
System.InvalidOperationException: 'Null 許容のオブジェクトには値を指定しなければなりません。'
dateTime1 = null; の後に、nullをDateTimeにキャストした時に例外が発生しています。
なので、キャストする前にnullチェックは必須かなと思います。
解決法 - その2|キャスト(型変換)する
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | DateTime? dateTime1 = new DateTime(2020, 2, 25); // 2020年2月26日 if (dateTime1.HasValue) { // dateTime1はnullじゃないのでここは通る。 DateTime dateTime2 = dateTime1.Value; } dateTime1 = null; if (dateTime1.HasValue) { // dateTime1はnullなのでここは通らない。 DateTime dateTime3 = dateTime1.Value; } |
「if (dateTime1.HasValue)」でdateTime1という変数が値をもっているかチェックします。
値をもっていれば、HasValueでTrueが返るので、if文の中が実行されます。
nullで値を持っていない場合は、HasValueでFalseが返るので、if文の中が実行されません。
実際の値を取得するときには、「dateTime1.Value」で値取得できます。
まとめ|datetime?をdatetimeに変換する方法
- null合体演算子「??」を使う
- キャスト(型変換)してあげる(例外に気を付ける)
- HasValueで値を持っているかチェックして値取得