1

重複の可能性:
このコードが C# で無効なのはなぜですか?
条件演算子は暗黙的にキャストできませんか?

私が次のことをした場合:

bool someBool = false;
uint value = 0;

これらは問題ありません:

value = (someBool) ? 0 : (uint)1;
value = (someBool) ? (uint)0 : 1;

しかし、これはそうではありません:

value = (someBool) ? 0 : 1;

簡単に言うことができるのに、なぜ最後のものを使用できないのですか。

value = 0;
value = 1;

三項演算子の型はどのように決定されますか?

4

3 に答える 3

4

uintコンパイラが認識できるように、キャストする必要があります。0 と 1 の両方がuintまたは である可能性がありintます。

言語仕様は次のとおりです (MSDN のこちらからダウンロードできます)。

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

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

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

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

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

于 2012-06-14T19:34:58.703 に答える
1

数値を にキャストしない場合uint、コンパイラは、三項演算子の結果が であると想定しますが、int暗黙的に に変換することはできませんuint

于 2012-06-14T19:35:37.817 に答える
1

私の短い要約:

  var x = c ? a : b;

コンパイラはb、 が の型に変換できるかどうかを試行しa、そうでない場合aは の型に変換できるかどうかを調べbます。どちらも不可能な場合、エラーが発生します。

しかし、

 uint value = (someBool) ? 0 : 1;

三項演算子は単純に戻ります (ここではとintの両方が int です)。ab

代入の左側の変数は、型を決定するときに考慮されません。

于 2012-06-14T19:36:45.083 に答える