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で条件演算子(三項演算子)に仕様変更があった! - 地平線に行く