double? test = true ? null : 1.0;
私の本では、これは
if (true) {
test = null;
} else {
test = 1.0;
}
しかし、最初の行で次のコンパイラ エラーが発生します。
<null>
' ' と ' ' の間に暗黙的な変換がないため、条件式の型を特定できませんdouble
。
これは、コンパイラがステートメントを右から左に評価しようとするために発生します。これは、それ1.0
が double である (double ではない?) であると判断し、それから を参照することを意味しnull
ます。
したがって、 と の間に暗黙的な変換がないことは明らかです(実際、double
との間に暗黙的な変換はありません)。null
Struct
null
できることは、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
double? test = true ? (double?)null : 1.0;
動作します。null
これは、最初の式 ( ) の型から 2 番目の式 ( )の型への変換がないためdouble
です。
?: 式の型を推測するとき、代入の左側は使用されません。
ではb ? A : B
、 と の型が同じであるか、一方が他方に暗黙的に変換可能でなければなりませんA
。B
コンパイラは null と 1.0 の互換性を判断できないため、値を double? にキャストする必要があります。これは明示的に述べる必要があります。
double? test = true ? (double?) null : 1.0;