在抽象方法中使用泛型

时间:2013-11-07 08:28:35

标签: c# generics

我正面临编译错误,我很难弄清楚为什么编译器无法理解我想要做的事情! :)

它以抽象基类开头:

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());
    }
}

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

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

  

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

我无法强化派生类中的约束,所以我真的想知道如何排除它!

2 个答案:

答案 0 :(得分:2)

您不仅限于MyObject,而是限制MyObject派生的任何内容。您从中创建MyOtherObject并调用DoSomething<MyOtherObject>(),它会尝试返回Task<MyObject>,而不是Task<MyOtherObject>。将Task<MyObject>隐式投射到Task<MyOtherObject>是不可能的。所以代码不是有效的,也没有编译。

正如代码目前所示,不需要泛型。签名:

protected abstract Task<MyObject> DoSomething();

满足您的需求。

答案 1 :(得分:0)

覆盖时,覆盖全部。在这种情况下,对T的约束不再有效。