【发布时间】:2023-03-06 08:54:01
【问题描述】:
我有以下类关系
public interface ICapability
{
}
public interface IBaseService<T> where T : ICapability
{
}
public abstract class BaseService<out T> : IBaseService<T> where T : ICapability
{
// modified...
T MapEventToCapability(dynamic eventData, T capability);
}
public class SomeCapability : ICapability
{
}
public partial class Service1 : BaseService<SomeCapability>
{
public Service1()
{
}
}
public class ServiceResolver
{
public void Register(BaseService<ICapability> serviceToRegister)
{
}
}
我尝试调用 Register 方法,传入一个新的 service1,如下所示:
var b = new ServiceResolver();
var c = new Service1();
b.Register(c);
但是,我在调用 Register 时在 c 上遇到编译时错误,如下所示;
Cannot convert Service1 to BaseService<ICapability>
我假设因为 Service1 是 BaseService 类型,并且因为 SomeCapability 是 ICapability 类型,所以这不会是一个问题。
我也尝试转换为 BaseService,我尝试将 Register 上的输入参数更改为 IBaseService 并再次转换,但随后出现运行时错误。
【问题讨论】:
-
“协方差”是您要搜索的词
-
如果在那个添加的方法中传递了一个能力,为什么你需要传递它?
-
要清楚,如果方法是
T MapEventToCapability(dynamic eventData),它会工作得很好,因为它只会出去而不是进来。 -
@jamiec,我能够进行重构,以便将 T 删除为 only out。再次感谢您!
标签: c# class inheritance