小编Ara*_*h-s的帖子

嵌套接口的逆变问题

interface IModel
{ 
}

class ModelA : IModel
{
}

interface IService<T> where T: IModel
{
}

class ServiceA : IService<ModelA>
{
}
Run Code Online (Sandbox Code Playgroud)

鉴于上面的类和接口的定义,以下工作:

IModel model = new ModelA();
Run Code Online (Sandbox Code Playgroud)

表明ModelA可以强制转换为其接口IModel

以下也适用:

IService<ModelA> service1 = new ServiceA();
Run Code Online (Sandbox Code Playgroud)

表明ServiceA可以强制转换为其接口IService<ModelA>

但是,以下情况会失败:

IService<IModel> service2 = new ServiceA();
Run Code Online (Sandbox Code Playgroud)

错误消息表明ServiceA不能隐式转换为IService<IModel>

我对此感到惊讶,因为:
ModelA可以转换为IModel,并且
ServiceA可以转换为IService<IModel>
我期望发生以下情况:
ServiceA-> IService<ModelA>->IService<IModel>

但这似乎不可能。

有人能解释为什么吗?

.net c# generics contravariance nested-generics

1
推荐指数
1
解决办法
53
查看次数

标签 统计

.net ×1

c# ×1

contravariance ×1

generics ×1

nested-generics ×1