2009-05-06 17 views
10

なぜこのC#コードはコンパイルされませんか?私の本の中で

double? test = true ? null : 1.0; 
が、これは

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

と同じですが、最初の行は、このコンパイラエラーを与える:

Type of conditional expression cannot be determined because there is no implicit conversion between ' <null> ' and ' double '.

+0

あなたはいつでも本の出版社に正誤表を提出することができます:)またはそれはすでに見つかっており、書籍の正誤表(通常は出版社のウェブサイト)にあります – balexandre

+3

「私の本」という表現は、 - それは実際の本への参照ではありません:-) –

+1

あなたの位置は、他と同じであるというあなたの位置は、言語仕様または実装のいずれによっても負うことはありません。それらの2つの事は本当に非常に異なっています!エラーメッセージは正しいです。言語仕様では、式を暗黙的にdouble?に変換する必要があります。これは、式に既知の型があることを必要とします。式には既知の型がないため、エラーです。 –

答えて

24

これは、コンパイラがステートメントを右から左へ評価しようとするためです。 これは1.0と見なされ、ダブルではないと判断した後、nullと表示されます。

だからはっきりdoublenullの間には暗黙の型変換が存在しない(実際にはStructnullの間には暗黙の型変換はありません)。

あなたができることは、相互に変換可能な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 
+0

ありがとう、これは動作します! –

7
double? test = true ? (double?)null : 1.0; 

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

+0

Hehe、同じ答えは他のway around、今混乱しています:) – leppie

+0

サプライズ、両方の方法で動作します:) – leppie

+0

"nullを 'null'をnullに変換できない値型であるため、" –

2

コンパイラがnullと1.0の互換性であるために、値を二重にキャストする必要があることを把握することはできませんので?。これは明示的に述べる必要があります。

double? test = true ? (double?) null : 1.0; 
+0

'null'(リテラル)**は** double型に変換可能です。それ以外の場合は、「true? null:(double?)1.0'は動作しませんでした。 'ヌル'は変換できないものは 'double'です。 –

+0

@JeppeStigNielsen暗黙のうちに。私はそれがコンバーチブルだと完全に同意する。 –

4

?:式のタイプを推測するときには、割り当ての左側は使用されません。

b ? A : Bには、ABのタイプが同じであるか、暗黙的に他のタイプに変換可能である必要があります。

+2

ここでは、AのタイプはBのタイプに変換可能でなければならないか、またはAはBのタイプに変換可能でなければならないということがありますか? コンパイラは実際に間違っています!このポストを参照してください 詳細については、http://blogs.msdn.com/ericlippert/archive/2006/05/24/type-in​​ference-woes-part-one.aspx を参照してください。 –

関連する問題