?を使用したNullable型の問題:条件演算子
-
08-07-2019 - |
質問
C#.NET 2.0でこれが機能する理由を誰かに説明してください:
Nullable<DateTime> foo;
if (true)
foo = null;
else
foo = new DateTime(0);
...しかし、これはそうではありません:
Nullable<DateTime> foo;
foo = true ? null : new DateTime(0);
後者の形式では、コンパイルエラーが発生しますおよび 'System.DateTime'。<!> quot;
前者を使用できないというわけではありませんが、2番目のスタイルは残りのコードとより一貫しています。
解決
この質問はすでに何度も聞かれています。コンパイラは、null
をDateTime
に変換する方法がわからないことを伝えています。
解決策は簡単です:
DateTime? foo;
foo = true ? (DateTime?)null : new DateTime(0);
Nullable<DateTime>
はDateTime?
と書くことができるため、入力の手間が省けます。
他のヒント
FYI(オフトピック、ただし気の利いた、null許容型に関連)
??
このように使用:
// Left hand is the nullable type, righthand is default if the type is null.
Nullable<DateTime> foo;
DateTime value = foo ?? new DateTime(0);
三項演算子では、2つの値が同じ型に解決される必要があるためです。
受け入れられているものと同様の別の解決策は、C#の default
キーワード。ジェネリックを使用して定義されていますが、実際にはすべての型に適用できます。
OPの質問に適用される使用例:
Nullable<DateTime> foo;
foo = true ? default(DateTime) : new DateTime(0);
現在受け入れられている回答の使用例:
DateTime? foo;
foo = true ? default(DateTime) : new DateTime(0);
また、nullable
を使用すると、変数にnull
を割り当てるために変数を<=>として指定する必要がありません。コンパイラーは、特定の変数タイプのデフォルト値を自動的に割り当て、エラーは発生しません。例:
DateTime foo;
foo = true ? default(DateTime) : new DateTime(0);
2008年にこの質問が行われたのは知っていますが、今では5年後ですが、答えとしてマークされた答えは私を満足させません。本当の答えは、DateTimeは構造体であり、構造体としてはnullと互換性がないということです。あなたはそれを解決する2つの方法があります:
最初に、nullをDateTimeと互換性のあるものにします(たとえば、70回の賛成票を持つ紳士が示唆するように、nullをDateTimeにキャストするか、nullをObjectまたはValueTypeにキャストします)。
2番目は、DateTimeをnullと互換にすることです(たとえば、DateTimeをDateTimeにキャストしますか?)。