JavaプログラマーがC#でプログラムを書いて引っかかったところ その2

Javaで動くので、C#でも動くと思ったんですが・・・。
条件演算子(三項演算子)で、:の左側と右側に共通のインタフェースを持つ別のクラスを書くと、コンパイルエラーになりした。

/* -- Java -- */
public interface X { ・・・ }
public class A implements X { ・・・ }
public class B implements X { ・・・ }

public void test(boolean isFirst){
    X x = isFirst ? new A() : new B();    // OK
    ・・・
}
/* -- C# -- */
public interface X { ・・・ }
public class A : X { ・・・ }
public class B : X { ・・・ }

public void Test(boo isFirst) {
    X x = isFirst ? new A() : new B();    // NG : コンパイルエラー
    ・・・
}


エラーメッセージは「'Test.Program.A' と 'Test.Program.B'' の間に暗黙的な変換がないため、条件式の型がわかりません。」*1
つまり、C#の条件演算子は「A a = b(どちらかの型に、もう片方の変数が明示的なキャストなしで代入できる)」がOKなように書かないとエラーになるようです。
今回の場合は、どちらかをキャストすればコンパイルが通るようになりました。

    X x = isFirst ? (X)new A() : new B();    // OK


もしくは、if文で書いても回避できるようです。

    X x;
    if (isFirst) {
        x = new A();
    } else {
        x = new B();
    }


・・・早くも重箱の隅をつついてしまいました(笑)

                      • -

追記があります ⇒ Java5で条件演算子(三項演算子)に仕様変更があった! - 地平線に行く

*1:C#の言語仕様にも似たようなことが書かれています。「Either the type of first_expression and second_expression must be the same, or an implicit conversion must exist from one type to the other. (1番目の式と2番目の式は同じ型か、どちらかの型からもう片方への暗黙の型変換が存在する必要があります。)」