c#使用泛型类型在接口类型之间进行转换

c#使用泛型类型在接口类型之间进行转换,c#,generics,interface,casting,C#,Generics,Interface,Casting,我有一个类MockRepository,它实现了接口IRepository,我还有一个类技术,它实现了接口IIdentifiable 我想将对象从MockRepository强制转换为IRepository,并在某些操作完成后再次强制转换。这可能吗?我的代码可以编译,但当我尝试运行它时,我得到一个无效的强制转换异常。简短的回答是否 如果您有一个接口IMyInterface,那么编译器将为您使用的每种类型的T创建一个新接口,并替换T的所有值 举个例子: 我有一个界面: public interfa

我有一个类
MockRepository
,它实现了接口
IRepository
,我还有一个类
技术
,它实现了接口
IIdentifiable

我想将对象从
MockRepository
强制转换为
IRepository
,并在某些操作完成后再次强制转换。这可能吗?我的代码可以编译,但当我尝试运行它时,我得到一个无效的强制转换异常。

简短的回答是否

如果您有一个接口
IMyInterface
,那么编译器将为您使用的每种类型的T创建一个新接口,并替换T的所有值

举个例子:

我有一个界面:

public interface IMyInterface<T> {
   public T Value {get; set;}
}
然后我定义如下

public class Orange : IMyInterface<Foo> {}

public class Banana : IMyInterface<Bar> {}
 public void MyFunction<T>(IRepository<T> repo) where T: IIdentifiable {
 }
如您所见,
RandomInterface
AlternativeInterface
之间没有关系。因此,从
RandomInterface
继承的类不能强制转换为
AlternativeInterface

阅读问题评论后更新

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

public class Orange : IMyInterface<Foo> {}

public class Banana : IMyInterface<Bar> {}
 public void MyFunction<T>(IRepository<T> repo) where T: IIdentifiable {
 }
public void MyFunction(假定回购),其中T:i可识别{
}
简短的回答是否定的

如果您有一个接口
IMyInterface
,那么编译器将为您使用的每种类型的T创建一个新接口,并替换T的所有值

举个例子:

我有一个界面:

public interface IMyInterface<T> {
   public T Value {get; set;}
}
然后我定义如下

public class Orange : IMyInterface<Foo> {}

public class Banana : IMyInterface<Bar> {}
 public void MyFunction<T>(IRepository<T> repo) where T: IIdentifiable {
 }
如您所见,
RandomInterface
AlternativeInterface
之间没有关系。因此,从
RandomInterface
继承的类不能强制转换为
AlternativeInterface

阅读问题评论后更新

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

public class Orange : IMyInterface<Foo> {}

public class Banana : IMyInterface<Bar> {}
 public void MyFunction<T>(IRepository<T> repo) where T: IIdentifiable {
 }
public void MyFunction(假定回购),其中T:i可识别{
}
我想你有:

class MockRepository<T> : IRepository<T>  // note: same T
{
}

interface IRepository<out X>  // note: "out" means covariance in X
{
}
class-MockRepository:IRepository//note:same T
{
}
接口i假设//注:“out”表示X中的协方差
{
}
然后,因为
技术
是一种
可识别的
,协方差给出了
i假设
也是一种
i假设

因此,如果您的
I假设接口是(或可以是)协变的,它应该可以工作。

我认为您有:

class MockRepository<T> : IRepository<T>  // note: same T
{
}

interface IRepository<out X>  // note: "out" means covariance in X
{
}
class-MockRepository:IRepository//note:same T
{
}
接口i假设//注:“out”表示X中的协方差
{
}
然后,因为
技术
是一种
可识别的
,协方差给出了
i假设
也是一种
i假设


因此,如果您的
i假设接口是(或可以是)协变的,那么它应该可以工作。

为什么您要这样做?为了澄清@antonijn的问题,为什么您需要投射这些对象
MockRepository
已经是
IRepository
,因此您可以获得所有
IRepository
功能,
技术
可识别的
,因此您也可以获得该接口实现。也许,如果您向我们展示如何使用它们,以及您试图通过此转换实现什么,我们可以为您提供更多帮助。通常,您可以在希望强制转换到
IRepository
的所有情况下使用
MockRepository
,它应该可以在不首先强制转换的情况下工作。如果还有其他原因,请提供一些代码来澄清您的问题。若要将其作为参数传递给将
IRepository
作为参数类型的函数,请执行以下操作。如果我将参数类型定义为
MockRepository
,那么我不能将其用于实际的存储库对象和从repositories获取的其他可识别对象。该参数必须包含相关的代码位和完整的错误消息。事实上,很难正确回答。类定义会有所帮助。请记住,泛型集合是不可互换的,所以和弥补了两种不同的集合类型。为什么要这样做?为了澄清@antonijn的问题,为什么需要强制转换这些对象
MockRepository
已经是
IRepository
,因此您可以获得所有
IRepository
功能,
技术
可识别的
,因此您也可以获得该接口实现。也许,如果您向我们展示如何使用它们,以及您试图通过此转换实现什么,我们可以为您提供更多帮助。通常,您可以在希望强制转换到
IRepository
的所有情况下使用
MockRepository
,它应该可以在不首先强制转换的情况下工作。如果还有其他原因,请提供一些代码来澄清您的问题。若要将其作为参数传递给将
IRepository
作为参数类型的函数,请执行以下操作。如果我将参数类型定义为
MockRepository
,那么我不能将其用于实际的存储库对象和从repositories获取的其他可识别对象。该参数必须包含相关的代码位和完整的错误消息。事实上,很难正确回答。类定义会有所帮助。但请记住,泛型集合是不可互换的,因此,和弥补了两种不同的集合类型。