質問

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番目のスタイルは残りのコードとより一貫しています。

役に立ちましたか?

解決

この質問はすでに何度も聞かれています。コンパイラは、nullDateTimeに変換する方法がわからないことを伝えています。

解決策は簡単です:

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にキャストしますか?)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top