3

誰かが私にキャストしなければならない論理的な理由を説明してもらえますかnullint?

左の引数の型が両方の型を持つことができるのはいつですか?

する代わりに

  int? k = (DateTime.Now.Ticks%5 > 3 ? 1 : null);

私は実行する必要があります

  int? k = (DateTime.Now.Ticks%5 > 3 ? 1 : (int?) null);

int? k = null完全に有効ですが。

反対の例:

私はそれをする必要はありませんでした:

string k = (DateTime.Now.Ticks%5 > 3 ? "lala" : null);

4

2 に答える 2

10
int? k = (DateTime.Now.Ticks%5 > 3 ? 1 : (int?) null);

この場合、私たちが持っているのは 1 でintあり、null実際には ですnull 混乱は、三項演算子が戻り値の型intまたはよく混乱していることでありnullint受け入れられないためですnull

したがって、nullableにキャストする必要がありますint

他のケースでは、文字列があり、 null は完全に受け入れられますstring

詳しい説明はType inference - Ericにあります。

?: 演算子の 2 番目と 3 番目のオペランドは、条件式のタイプを制御します。X と Y を 2 番目と 3 番目のオペランドの型とします。それで、

  • X と Y が同じ型の場合、これは条件式の型です。

  • それ以外の場合、X から Y への暗黙的な変換が存在し、Y から X への変換が存在しない場合、Y は条件式の型です。

  • それ以外の場合、Y から X への暗黙的な変換が存在するが、X から Y への変換は存在しない場合、X は条件式の型です。

  • そうしないと、式の型を判別できず、コンパイル エラーが発生します。

于 2013-02-07T08:08:40.987 に答える
2

コンパイラは、左側の変数の型を使用して右側の式の型を決定しないためです。最初に式の型を判断し、次にそれを変数に入れることができるかどうかを判断します。

intnull値の間で共通する十分に近い型はありません。コンパイラが値の共通点を見つけるには、int値をnull可能にするか、値を「intable」にする必要があります。null

stringと値がある場合null、文字列はすでに null 可能であるため、コンパイラは単純に型の 1 つを使用できます。

于 2013-02-07T08:14:56.470 に答える