12
double? test = true ? null : 1.0;

私の本では、これは

if (true) {
  test = null;
} else {
  test = 1.0;
}

しかし、最初の行で次のコンパイラ エラーが発生します。

<null>' ' と ' ' の間に暗黙的な変換がないため、条件式の型を特定できませんdouble

4

4 に答える 4

28

これは、コンパイラがステートメントを右から左に評価しようとするために発生します。これは、それ1.0が double である (double ではない?) であると判断し、それから を参照することを意味しnullます。

したがって、 と の間に暗黙的な変換がないことは明らかです(実際、doubleとの間に暗黙的な変換はありません)。nullStructnull

できることは、2 つの式のうちの 1 つが相互に変換可能であることをコンパイラに明示的に伝えることです。

double? test = true ? null : (double?) 1.0;    // 1
double? test = true ? (double?)null : 1.0;     // 2
double? test = true ?  default(double?) : 1.0; // 3
double? test = true ? new double?() : 1.0;     // 4
于 2009-05-06T10:16:37.607 に答える
8
double? test = true ? (double?)null : 1.0;

動作します。nullこれは、最初の式 ( ) の型から 2 番目の式 ( )の型への変換がないためdoubleです。

于 2009-05-06T10:16:26.127 に答える
4

?: 式の型を推測するとき、代入の左側は使用されません。

ではb ? A : B、 と の型が同じであるか、一方が他方に暗黙的に変換可能でなければなりませんAB

于 2009-05-06T10:23:41.803 に答える
2

コンパイラは null と 1.0 の互換性を判断できないため、値を double? にキャストする必要があります。これは明示的に述べる必要があります。

double? test = true ? (double?) null : 1.0;
于 2009-05-06T10:17:48.807 に答える