我有一个MockRepository
实现 interfaceIRepository
的类,我有一个Technology
实现 interface的类IIdentifiable
。
我想在某些操作完成后将一个对象从MockRepository<Technology>
to 转换IRepository<IIdentifiable>
回来。这可能吗?我的代码可以编译,但是当我尝试运行它时,我得到一个无效的强制转换异常。
简短的回答是否定的。
如果您有一个接口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
阅读问题评论后更新
如果您希望将 MockRepository 传递给需要 IRepository 的函数,您可以执行以下操作
public void MyFunction<T>(IRepository<T> repo) where T: IIdentifiable {
}
我认为你有:
class MockRepository<T> : IRepository<T> // note: same T
{
}
interface IRepository<out X> // note: "out" means covariance in X
{
}
那么因为 aTechnology
是一个IIdentifiable
,协方差给出了一个IRepository<Technology>
也是一个IRepository<IIdentifiable>
。
因此,如果您的IRepository<>
界面是(或可以制作)协变的,它应该可以工作。