如果我有这个示例界面:
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>
继承的类型。
我错过了什么或做错了什么?类型不应该是可转换的,因为它们是从基类继承的吗?