Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 嵌套接口的逆变问题_C#_.net_Generics_Contravariance_Nested Generics - Fatal编程技术网

C# 嵌套接口的逆变问题

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修饰符,使其协变 协方差使您能够使

表示ModelA可以转换为其接口IModel

以下方法也有效:

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
{
}