2012-03-07 41 views
2

三項演算子を使用すると、舞台裏で何が起こるか教えてください。 のコード行はない:C#の三項演算子

string str = 1 == 1 ? "abc" : "def"; 

のif/else文、単純なように生成されますか? 次のことを考えてみましょう:

次のように今、三元表現を使用して
class A 
{ 
} 

class B : A 
{ 
} 

class C : A 
{ 
} 

A a1 = 1 == 1 ? new B() : new C(); 

を、これはこれでもエラーでコンパイルされません。

Type of conditional expression cannot be determined because there is no implicit conversion between 'ConsoleApp1.B' and 'ConsoleApp2.C'

誰もがこの1に光を当てることができます?

+0

この回答を見る:http://stackoverflow.com/a/4290218/26396 –

+1

注:これはCLRに関するものではなく、 a * 3項演算子(そして唯一のもの)は、演算子の* name *は条件演算子です。 –

答えて

1

条件演算子は、変換があるかどうかによって2番目の式の最初の式の型を効果的に使用します(それ以外の場合は常にobject? "hello" : 10になります)。

この場合、コンパイラは正しい - 2つのタイプ間の変換はありません。最初のキャストでキャストを追加すると、コンパイルされます - (A)new B()

8

条件演算式のタイプは、第二オペランド又は第三のオペランドのタイプのいずれかタイプであることが必要です。そのうちの1つは、他のものに変換可能でなければなりません。

あなたのケースでは、それらはお互いに変換可能ではありませんが、両方とも第3のタイプ(A)に変換可能です。これは、コンパイラによって考慮されていないが、あなたはそれを強制することができます

A a1 = 1 == 1 ? new B() : (A) new C(); 

または

A a1 = 1 == 1 ? (A) new B() : new C(); 

節をご覧ください詳細は、C#4仕様の7.14。

2

msdn ?Operator

If condition is true, first expression is evaluated and becomes the result; if false, the second expression is evaluated and becomes the result. Only one of two expressions is ever evaluated.

そのかなり明示からの抽出物。

そして、あなたのエラーは、CにBを代入しようとしている、あまりにもかなり明示的です...しかし、誰キャストは利用できないので、エラー...非常にシンプル

0

Its pretty explicit.

And your error is pretty explicit too, you are trying to assign a B to a C ... But no cast is available, so error ... Pretty simple

ないで、すべての関連します。

B及びCは、Aから派生

式である:

A1 = 1 == 1?新しいB():新しいC();

両方の式が

から派生型がちょうどコンパイラはの表情を見て返す?:演算子、および変数A1(式の左辺)の種類が何であるかを気にしません... 。 そのような実装の理由は非常に興味深いです...