C# 嵌套接口的逆变问题
表示ModelA可以转换为其接口IModel 以下方法也有效:C# 嵌套接口的逆变问题,c#,.net,generics,contravariance,nested-generics,C#,.net,Generics,Contravariance,Nested Generics,表示ModelA可以转换为其接口IModel 以下方法也有效: IModel model = new ModelA(); 错误消息表示ServiceA不能隐式转换为iSeries 我对此感到惊讶,因为: ModelA可以转换为IModel,并且 ServiceA可以强制转换为iSeries 我预计会发生以下情况: 服务A->iSeries设备->iSeries设备 但这似乎不可能 有人解释为什么会这样吗?这里唯一的实际选择是对iSeries的通用类型应用out修饰符,使其协变 协方差使您能够使
IModel model = new ModelA();
错误消息表示ServiceA不能隐式转换为iSeries
我对此感到惊讶,因为:
ModelA可以转换为IModel,并且
ServiceA可以强制转换为iSeries
我预计会发生以下情况:
服务A->iSeries设备->iSeries设备
但这似乎不可能
有人解释为什么会这样吗?这里唯一的实际选择是对iSeries的通用类型应用out修饰符,使其协变 协方差使您能够使用比指定类型更派生的类型 通过泛型参数 具体地说,尽管看起来IService与ServiceA不同,IService也不是一回事 out的意思是粗略地说,它只能出现在输出位置 不过,请注意,这将严重限制您使用T
如果您需要在iSeries设备中使用T,并且它不仅仅是iSeries设备中方法的返回,那么您可能需要使用object或重新思考问题考虑iSeries设备具有方法x。如果您可以将IService转换为IService,那么现在可以使用任何对象调用Foo。那不行。@CharlesMager有道理!谢谢您:
IModel model = new ModelA();
IService<ModelA> service1 = new ServiceA();
IService<IModel> service2 = new ServiceA();
interface IService<out T> where T : IModel
{
}