3

以下代码无法编译:

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>
{
...
}

知道为什么会发生以及如何解决吗?

4

2 回答 2

1

你应该这样做

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

然后你可以使用WorkerServiceConfiguration类型对象

于 2013-07-30T14:05:30.910 回答
1

我认为你有太多的泛型层,它变得令人困惑。实际答案在底部,但首先是题外话来解释问题......

WorkerServiceConfiguration 继承自 ICoordinationExecutionService 是正确的。这就是为什么这段代码可以工作的原因:

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

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

public interface ITaskScheduleAlgorithm<TType>
{
}

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

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

如果您尝试运行这个简化的示例,您将得到完全相同的错误。你知道字符串是从对象派生的,所以你会期望多态这应该有效。然而,仅仅因为字符串派生自对象并不意味着 SimpleTaskScheduleAlgorithm 实现了 ITaskScheduleAlgorithm。这取决于具体实现了哪些泛型方法。例如,考虑 List 的情况 - 即使字符串派生自对象,您也不能将新对象添加到 List。

为了完成这项工作,您需要在接口声明中添加“out”关键字。对于我们的简单案例:

公共接口 ITaskScheduleAlgorithm { }

这表明接口是协变的(请参阅泛型中的协变和逆变)。请注意,如果接口没有接受泛型类型实例作为参数的方法,则只能使接口协变。因此,您的问题的最终答案是向您的 ITaskScheduleAlgorithm 接口添加协变支持:

public interface ITaskScheduleAlgorithm<TType, out TType2>
{
}
于 2013-07-30T14:34:27.527 回答