0

MockRepositoryインターフェイスを実装するクラスIRepositoryがあり、インターフェイスを実装するクラスTechnologyがありますIIdentifiable

MockRepository<Technology>からオブジェクトをキャストIRepository<IIdentifiable>し、いくつかの操作が完了した後に再度キャストしたいと考えています。これは可能ですか?私のコードはコンパイルされますが、実行しようとすると無効なキャスト例外が発生します。

4

2 に答える 2

4

短い答えはノーです。

インターフェイスがある場合IMyInterface<T>、コンパイラは、使用する T の型ごとに新しいインターフェイスを作成し、T のすべての値を置き換えます。

例を挙げると:

私はインターフェースを持っています:

public interface IMyInterface<T> {
   public T Value {get; set;}
}

私は2つのクラスを持っています:

public class Foo {}

public class Bar : Foo {}

次に、次のように定義します

public class Orange : IMyInterface<Foo> {}

public class Banana : IMyInterface<Bar> {}

コンパイラは、特定の命名規則を使用して 2 つの新しいインターフェイスを自動的に作成します。異なる名前を使用して、それらが異なることを強調します。

public interface RandomInterface {
   Foo Value { get; set; }
}

public interface AlternativeInterface {
   Bar Value { get; set; }
}

public class Orange : RandomInterface {
}

public class Banana : AlternativeInterface {
}

ご覧のとおり、 と の間RandomInterfaceに関係はありませんAlternativeInterface。したがって、から継承するクラスRandomInterfaceはキャストできませんAlternativeInterface

質問のコメントを読んだ後に更新

IRepository を期待する関数に MockRepository を渡したい場合は、次のようにします。

 public void MyFunction<T>(IRepository<T> repo) where T: IIdentifiable {
 }
于 2013-04-05T09:35:23.907 に答える