8

重複の可能性:
Null許容型と三項演算子。なぜこれが機能しないのですか?
nullable <value>型を使用した条件付き演算子の割り当て?

これはコンパイルされず、「'System.DateTime'と''の間に暗黙の変換がないため、条件式のタイプを判別できません」と述べています。

task.ActualEndDate = TextBoxActualEndDate.Text != "" ? DateTime.Parse(TextBoxActualEndDate.Text) : null;

これは問題なく動作します

 if (TextBoxActualEndDate.Text != "")
    task.ActualEndDate = DateTime.Parse(TextBoxActualEndDate.Text);
else
    task.ActualEndDate = null;
4

6 に答える 6

8

コンパイラは両側に暗黙の変換を一度に挿入せずnull、null許容型になるには暗黙の変換が必要なため、これは機能しません。

代わりに、あなたは書くことができます

task.ActualEndDate = TextBoxActualEndDate.Text != "" ? 
    DateTime.Parse(TextBoxActualEndDate.Text) : new DateTime?();

これには、1つの暗黙的な変換(DateTimeからDateTime?)のみが必要です。

または、左側をキャストすることもできます。

task.ActualEndDate = TextBoxActualEndDate.Text != "" ? 
    (DateTime?)DateTime.Parse(TextBoxActualEndDate.Text) : null;

また、これには1つの暗黙的な変換のみが必要です。

于 2010-03-15T22:22:00.390 に答える
4

条件演算子は、値が何に返されるかを調べません。DateTimeとnullのどちらかを選択するように求められている値のみを調べます。これらを同じタイプのインスタンスとして識別できないため(nullは有効なDateTimeではないため)、エラーが発生します。あなたと私はそれNullable<DateTime>が仕事をすることができることを知っていますが、条件演算子は「より大きな」型を導入することを許可されていません:それはそれが選択する2つの式の型を見ることがのみ許可されています。(この点を明確にするためのコメントと素晴らしい明確な例についてのAaronaughtに感謝します。)

これを回避するには、DateTimeをキャストしてオペレーターにヒントを与えます。

TextBoxActualEndDate.Text != "" ? (DateTime?)(DateTime.Parse(TextBoxActualEndDate.Text)) : null;
                                  ^^^^^^^^^^^
于 2010-03-15T22:23:25.830 に答える
1

これはの複製です

null許容型と三項演算子:なぜ `?10:null`は禁止されていますか?

私の答えは

条件演算子は暗黙的にキャストできませんか?

この質問に密接に関係する分析を提供します。

また、4月に条件演算子に関する同様の問題についてブログを書きます。詳細についてはブログをご覧ください。

于 2010-03-16T05:54:04.347 に答える
0

その理由は、nullはタイプであるobjectため、次のように正しいタイプにキャストする必要があるためです。

task.ActualEndDate = TextBoxActualEndDate.Text != "" ? 
    DateTime.Parse(TextBoxActualEndDate.Text) : ((DateTime?) null);
于 2010-03-15T22:24:25.777 に答える
0

最も正しい方法(IMO)はこれを行うことです

task.ActualEndDate = TextBoxActualEndDate.Text != "" ? 
    (DateTime?)(DateTime.Parse(TextBoxActualEndDate.Text) : null);

私はこのようにnull照合演算子を頻繁に使用します。

于 2010-03-15T22:24:33.317 に答える
0

これは、おそらくこの状況で発生するエラーです。

エラーCS0173:''と'int'の間に暗黙の変換がないため、条件式のタイプを判別できません)

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


修理:

あなたはタイプに戻るかもしれないにcast explicitlyする必要があります。これはうまくいくでしょうexpressionnullnullable

((DateTime?) null);
于 2010-03-15T22:25:15.077 に答える