2017-12-28 35 views
0

Iスーパータイプの参照(アップキャスト)に任意のサブタイプを割り当てることができる場合:条件演算子の割り当て

IWService wService; 
wService = new WService(); 
wService = new WServiceStub(); 

なぜ条件演算子? :に割り当てることができないのですか?

IWService wService = isStub ? new WServiceStub() : new WService(); 

私はこのエラーを取得:

Type of conditional expression cannot be determined because there is no implicit conversion between MyNamespace.WServiceStub and MyNamespace.WService

をしかし、それはコンパイルするスーパータイプにそれらのいずれかをキャストするだけで十分です:

IWService wService = isStub ? (IWService)new WServiceStub() : new WService(); 

または

IWService wService = isStub ? new WServiceStub() : (IWService)new WService(); 

Iドン私が決してgeをしないと明白なキャストが必要な理由を理解していないt InvalidCastException。変換はいつも確実ですね。

次のコードはまったく同じではありませんか?

IWService wService; 
if (isStub) 
{ 
    wService = new WServiceStub(); 
} 
else 
{ 
    wService = new WService(); 
} 
+1

WServiceとWServiceStubの両方にIDisposableとIWServiceが実装されている場合、どの型が式 'isStub?新しいWServiceStub():新しいWService() 'がありますか? – Heinzi

答えて

-1

なお、第3オペランドの型が第二のタイプに変換可能でなければならないので、式の結果の型を決定するとき、それは割り当ての左側を見ないです。

+0

それは完全に正確ではありません。第2のものは第3のもののタイプにも変換可能である。 https://stackoverflow.com/a/18260915/860585をご覧ください。 – Rotem