了解通用接口继承和assigmnet

时间:2017-10-05 21:41:49

标签: c# generics inheritance interface covariance

如果我有这个示例界面:

public class BaseReq { }
public class BaseResp { }

public interface IService<in TReq, out TResp>
    where TReq : BaseReq
    where TResp : BaseResp
{
    // Methods
    // ...
}

我将此服务的两个“类型”实现为派生接口:

public class TypeAReq : BaseReq { }
public class TypeAResp : BaseResp { }
public interface IServiceTypeA : IService<TypeAReq, TypeAResp> { }

public class TypeBReq : BaseReq { }
public class TypeBResp : BaseResp { }
public interface IServiceTypeB : IService<TypeBReq, TypeBResp> { }

最后,如果我尝试分配一个可分配给两个接口的变量:

IServiceTypeA GetTypeAService() { ... }
IServiceTypeB GetTypeBService() { ... }

void Run()
{
    IService<BaseReq, BaseResp> myService = someFlag
        ? GetTypeAService()
        : GetTypeBService();
}

我收到错误说:

  

无法将IService<TypeAReq, TypeAResp>类型隐式转换为IService<BaseReq, BaseResp>。存在显式转换(您是否错过了演员?)

如果我试图施展它,ReSharper警告我说:

  

可疑演员:没有从IService<TypeAReq, TypeAResp>IService<BaseReq, BaseResp>继承的类型。

我错过了什么或做错了什么?类型不应该是可转换的,因为它们是从基类继承的吗?

0 个答案:

没有答案