1

次の簡単な例を見てください。

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 行目にコンパイル時エラーを引き起こします (暗黙的な変換を実行できないことを示します)。

4

3 に答える 3

8

名前が付けられた 2つの型、IComplexInterface またはComplexImplementation異なる名前空間で名前が付けられた 2 つの型があります。

using ステートメントを削除し、型に完全な修飾子を使用して、問題が解決するかどうかを確認します。実装クラスのダブル チェックに移動して、割り当て先と同じインターフェイスを実装するようにします。インターフェイスとクラスが存在する名前空間に注意してください。

于 2012-04-14T08:50:27.833 に答える
2

間接的なインターフェイスのインスタンス化は正常です。質問で簡潔にするために定義されているように、例はコンパイルされて実行されます。

public interface ICar{}
public class Viper : ICar{}

ICar fun = new Viper();

通常、これはある種の Factory パターンにラップされますが、かなり基本的なものです。いずれにせよ、プロセスは一般的であるため、問題は実装にあるはずです。

于 2012-04-13T20:45:59.447 に答える
2

何が原因か判明。このインターフェイスは、WCF サービス コントラクトとして使用されています。Svcutil は明らかに、グローバル名前空間にインターフェイスの複製を作成しています。それらは異なる名前空間にあったため、コンパイル エラーは発生しませんでした。2 つの異なる名前 (名前空間のあるものとないもの) を示すエラーに関する部分は、これが原因であることを示していました。

于 2012-04-16T15:21:37.117 に答える