.net 3.5 派生类型不能隐式转换为基接口 接口IModel{} 类MyModel:IModel{} 接口IRepo 其中T:IModel{} 类Repo:IRepo{} //编辑:一个较小的示例 IRepo repo=新的repo();//无法隐式转换。。存在显式转换。失踪演员? //老例子: /* 类型“Repo”不能用作泛型类型或方法中的类型参数“C”。 'Castle.MicroKernel.Registration.ComponentRegistration.ImplementedBy()'。 =>没有从“回购”到“IRepo”的隐式引用转换。 */ 集装箱。登记( 用于()的组件 .ImplementedBy());

.net 3.5 派生类型不能隐式转换为基接口 接口IModel{} 类MyModel:IModel{} 接口IRepo 其中T:IModel{} 类Repo:IRepo{} //编辑:一个较小的示例 IRepo repo=新的repo();//无法隐式转换。。存在显式转换。失踪演员? //老例子: /* 类型“Repo”不能用作泛型类型或方法中的类型参数“C”。 'Castle.MicroKernel.Registration.ComponentRegistration.ImplementedBy()'。 =>没有从“回购”到“IRepo”的隐式引用转换。 */ 集装箱。登记( 用于()的组件 .ImplementedBy());,.net-3.5,inheritance,interface,c#-3.0,.net 3.5,Inheritance,Interface,C# 3.0,但回购协议源自IRepo,MyModel源自IModel。为什么这样不行 我尝试在Repo上添加隐式运算符,但不允许在接口之间转换 这个问题是由c#4中的协变/反变问题解决的吗(不,我不知道我在说什么:)?你是对的。由于Co/对冲,它不起作用。它应该在C#4中工作(我没有测试它,因为我从不需要这样的东西:P) 关于它是如何工作的,可以在这里找到一个很好的解释:你的直觉是正确的。这是一个协方差问题。你看,IRepo和IRepo是不一样的 要允许协变类型,您可以使用C#4中的out修饰符修复它: 接

但回购协议源自IRepo,MyModel源自IModel。为什么这样不行

我尝试在Repo上添加隐式运算符,但不允许在接口之间转换


这个问题是由c#4中的协变/反变问题解决的吗(不,我不知道我在说什么:)?

你是对的。由于Co/对冲,它不起作用。它应该在C#4中工作(我没有测试它,因为我从不需要这样的东西:P)


关于它是如何工作的,可以在这里找到一个很好的解释:

你的直觉是正确的。这是一个协方差问题。你看,
IRepo
IRepo
是不一样的

要允许协变类型,您可以使用C#4中的
out
修饰符修复它:

接口IRepo,其中T:IModel{}
如果您尚未使用C#4,则需要严格使用:

interface IRepo<out T> where T: IModel {}
IRepo回购=新回购();

在C#4中,它不是开箱即用的。需要使用协方差修饰符修改
IRepo
界面:
out
interface IRepo<out T> where T: IModel {}
IRepo<MyModel> repo = new Repo();