次の簡単な例を見てください。
interface IVehicle {
}
class Car : IVehicle {
}
これで、次のことができるはずです。
IVehicle vehicle = new Car();
実際、これらの基本クラスを上記のように作成すると、コンパイル エラーは発生しません (コードは実行されます)。
しかし、私のプロジェクトでは、本質的にそのようなことをしている場所ではどこでも(私が見る限り)、次のエラーが発生します:
Cannot implicitly convert type 'Namespace.Path.Car' to 'IVehicle'. An explicit conversion exists (are you missing a cast?)
場合によっては (別のコンパイルではなく、別のコードの場所のように) 明示的なキャストが機能し、コンパイルしてもランタイム例外 (無効なキャスト) が作成されることがあります。基本的な例は問題なく動作し、より詳細なクラス (ただし、インターフェイスを直接実装する単一のクラス) にはこれらすべての問題があるのはなぜですか?
状況によっては、実際に次のコンパイル時エラーが発生することがあります。
Cannot implicitly convert type 'Namespace.Path.IVehicle' to 'IVehicle'. An explicit conversion exists (are you missing a cast?)
この暗黙のキャストが機能するために必要ないくつかの重要な条件が欠けていると思いますが、単純な例が機能し、より詳細なクラスが奇妙に失敗する原因となる違いはわかりません。私が見た唯一の注意点は、コンパイル時のエラーには最初の型の名前空間のみが含まれていることです (上記の 2 つのエラーに示されているように) が、それが正常かどうかは思い出せません。
環境の原因を取り除くために、次のコードだけでテスト ケースを作成しました。
ISimpleInterface simple = new SimpleImplementation();
IComplexInterface complex = new ComplexImplementation();
上記は、2 行目にコンパイル時エラーを引き起こします (暗黙的な変換を実行できないことを示します)。