0

我有一个MockRepository实现 interfaceIRepository的类,我有一个Technology实现 interface的类IIdentifiable

我想在某些操作完成后将一个对象从MockRepository<Technology>to 转换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

阅读问题评论后更新

如果您希望将 MockRepository 传递给需要 IRepository 的函数,您可以执行以下操作

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

我认为你有:

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<>界面是(或可以制作)协变的,它应该可以工作。

于 2013-04-05T09:51:53.303 回答