gpt4 book ai didi

c# - 泛型中的多态性 - 传递继承对象时出现编译错误(无法隐式转换类型)

转载 作者:行者123 更新时间:2023-11-30 17:04:04 24 4
gpt4 key购买 nike

以下代码无法编译:

protected override ITaskScheduleAlgorithm<CollectionTask, ICoordinationExecutionService<CollectionTask>> GetAlgorithm()
{
return new SimpleTaskScheduleAlgorithm<CollectionTask, WorkerServiceConfiguration>();
}

错误是:

无法隐式转换类型...

无法转换的类型:

WorkerServiceConfiguration → ICoordinationExecutionService

虽然类 WorkerServiceConfiguration 继承自 ICoordinationExecutionService:

public class WorkerServiceConfiguration : AbstractServiceConfiguration<CollectionTask>
{
...
}

public abstract class AbstractServiceConfiguration<TTask> : ICoordinationExecutionService<TTask>
{
...
}

知道为什么会发生这种情况以及如何解决它吗?

最佳答案

我认为您的泛型层数太多,而且越来越困惑。真正的答案在最下面,不过先说个题外话吧……

您说得对,WorkerServiceConfiguration 继承自 ICoordinationExecutionService。这就是这段代码有效的原因:

protected ICoordinationExecutionService<CollectionTask> Test()
{
return new WorkerServiceConfiguration();
}

但是,您不会返回 ICoordinationService。您正在返回一个 ITaskScheduleAlgorithm。忽略第二个是 ICoordinationExecutionService 的事实,您只关心这个接口(interface)声明。其实为了理解问题,我们再进一步简化一下:

public interface ITaskScheduleAlgorithm<TType>
{
}

public class SimpleTaskScheduleAlgorithm<TType> : ITaskScheduleAlgorithm<TType>
{
}

public ITaskScheduleAlgorithm<object> GetAlgorithm()
{
return new SimpleTaskScheduleAlgorithm<string>();
}

如果您尝试运行这个简化的示例,您将得到完全相同的错误。您知道字符串派生自对象,因此您希望通过多态性这应该起作用。但是,仅仅因为字符串派生自对象并不意味着 SimpleTaskScheduleAlgorithm 实现了 ITaskScheduleAlgorithm。这完全取决于实现了哪些通用方法。以 List 为例 - 即使字符串派生自对象,您也不能将新对象添加到 List。

为了使这项工作正常进行,您需要将“out”关键字添加到您的接口(interface)声明中。对于我们的简单案例:

公共(public)接口(interface) ITaskScheduleAlgorithm{

这表明接口(interface)是协变的(参见 covariance and contravariance in generics )。请注意,如果接口(interface)没有接受泛型实例作为参数的方法,则只能使接口(interface)协变。因此,您的问题的最终答案是为您的 ITaskScheduleAlgorithm 接口(interface)添加协变支持:

public interface ITaskScheduleAlgorithm<TType, out TType2>
{
}

关于c# - 泛型中的多态性 - 传递继承对象时出现编译错误(无法隐式转换类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17949135/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com