2

我面临编译器错误,我很难弄清楚为什么编译器无法理解我正在尝试做什么!:)

它从一个抽象基类开始:

abstract class Base
{
    protected abstract Task<T> DoSomething<T>() where T : MyObject;
}

请注意,我正在为 指定一个约束T,它应该是类型MyObject

现在我尝试从Base这种方式得出:

class Derived : Base
{
    protected override Task<T> DoSomething<T>()
    {
        return Task.FromResult<MyObject>(new MyObject());
    }
}

这对我来说看起来是有效的,因为我正在返回 a Task<MyObject>,它尊重约束。

但是编译器抱怨 DoSomething 的实现,说

无法将类型“ System.Threading.Tasks.Task<MyObject>”隐式转换为“ System.Threading.Tasks.Task<T>

我无法加强派生类中的约束,所以我真的想知道如何解决这个问题!

4

2 回答 2

2

您不是将其限制为 only MyObject,而是限制为源自 的任何内容MyObject。您从它创建MyOtherObject并调用DoSomething<MyOtherObject>()它,它会尝试返回 a Task<MyObject>,而不是Task<MyOtherObject>。不可能隐式Task<MyObject>转换为Task<MyOtherObject>. 因此代码无效且无法编译。

就目前的代码而言,不需要泛型。签名:

protected abstract Task<MyObject> DoSomething();

满足您的需求。

于 2013-11-07T08:34:20.960 回答
0

When you override you override it all. In this case the constraint over T is not longer valid.

于 2013-11-07T08:31:17.130 回答