159

誰かがこれがC#.NET2.0で機能する理由を説明できますか?

    Nullable<DateTime> foo;
    if (true)
        foo = null;
    else
        foo = new DateTime(0);

...しかし、これはしません:

    Nullable<DateTime> foo;
    foo = true ? null : new DateTime(0);

後者の形式では、「'<null>'と'System.DateTime'の間に暗黙の変換がないため、条件式のタイプを判別できません」というコンパイルエラーが発生します。

前者を使用できないわけではありませんが、2番目のスタイルは残りのコードとより一貫性があります。

4

5 に答える 5

335

nullコンパイラは、に変換する方法がわからないと言っていますDateTime

解決策は簡単です:

DateTime? foo;
foo = true ? (DateTime?)null : new DateTime(0);

たくさんのタイピングを節約するためNullable<DateTime>に書くことができることに注意してください。DateTime?

于 2008-11-17T15:21:26.653 に答える
20

参考までに(オフトピックですが、気の利いた、null許容型に関連しています)null合体演算子と呼ばれるnull許容型専用の便利な演算子があります

??

このように使用されます:

// Left hand is the nullable type, righthand is default if the type is null.
Nullable<DateTime> foo;
DateTime value = foo ?? new DateTime(0);
于 2008-11-17T15:25:48.767 に答える
8

これは、三項演算子では、2つの値が同じ型に解決される必要があるためです。

于 2008-11-17T15:22:25.607 に答える
3

この質問が 2008 年に行われたことは知っていますが、現在は 5 年経っていますが、回答としてマークされた回答には満足できません。本当の答えは、DateTime は構造体であり、構造体として null と互換性がないということです。それを解決するには、次の 2 つの方法があります。

まず、null を DateTime と互換性を持たせることです (たとえば、null を DateTime にキャストしますか? 70 票の賛成票を持つ紳士が示唆するように、null を Object または ValueType にキャストします)。

2 つ目は、DateTime を null と互換性があるようにすることです (たとえば、DateTime を DateTime にキャストしますか?)。

于 2013-04-07T21:46:30.897 に答える
3

受け入れられたものに似た別の解決策は、C# のdefaultキーワードを使用することです。ジェネリックを使用して定義されていますが、実際にはどの型にも適用できます。

OPの質問に適用される使用例:

Nullable<DateTime> foo;
foo = true ? default(DateTime) : new DateTime(0);

現在受け入れられている回答での使用例:

DateTime? foo;
foo = true ? default(DateTime) : new DateTime(0);

また、 を使用すると、変数に値を割り当てるためにdefault変数を指定する必要がなくなります。コンパイラは特定の変数型のデフォルト値を自動的に割り当て、エラーは発生しません。例:nullablenull

DateTime foo;
foo = true ? default(DateTime) : new DateTime(0);
于 2012-08-27T15:04:17.613 に答える