C# 在抽象方法中使用泛型

C# 在抽象方法中使用泛型,c#,generics,C#,Generics,我面临一个编译器错误,我很难弄明白为什么编译器不能理解我要做的事情!:) 它从一个抽象基类开始: abstract class Base { protected abstract Task<T> DoSomething<T>() where T : MyObject; } 这对我来说是有效的,因为我返回了一个任务,它尊重约束 但是编译器抱怨DoSomething的实现,说 无法将类型“System.Threading.Tasks.Task”隐式转换为“Syste

我面临一个编译器错误,我很难弄明白为什么编译器不能理解我要做的事情!:)

它从一个抽象基类开始:

abstract class Base
{
    protected abstract Task<T> DoSomething<T>() where T : MyObject;
}
这对我来说是有效的,因为我返回了一个
任务
,它尊重约束

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

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


我不能在派生类中加强约束,所以我真的很想知道如何解决这个问题

当您覆盖时,您将覆盖所有内容。在这种情况下,T上的约束不再有效

您不仅将其约束为
MyObject
,而且约束为从
MyObject
派生的任何对象。如果您从中创建了
MyOtherObject
,并调用
DoSomething()
,它将尝试返回
任务
,而不是
任务
。无法将
任务
隐式强制转换为
任务
。因此代码无效,无法编译

目前的代码不需要泛型。签名:

protected abstract Task<MyObject> DoSomething();
受保护的抽象任务DoSomething();

满足您的需要。

FromResult(…).Cast()?类在C中不是协变的#是的,泛型+基类的组合在这里似乎没有意义。实际上,MyObject确实有很多子类,目标是使用泛型,以便DoSomething的调用方可以指定他期望的子类。您将如何实现该要求?@ThomasWeiss我还没有尝试过,因此可能会有错误,但是如果您将Base更改为
受保护的抽象任务DoSomething(),其中t:MyObject,new并派生到
返回任务.FromResult(新的T())。这应该适用于任何具有无参数构造函数的派生类。这确实可行,但这里使用类型的构造函数只是为了演示这个问题,我实际上在方法中根据预期的返回类型执行不同的操作。我认为最基本的“问题”是,你不能将一项任务分配给一项任务,从而限制了我试图实现的目标。@undefined,为什么?这与David所接受的答案相同,但不太详细,因为覆盖时,T上的约束确实成立。还是我误解了你的答案?
protected abstract Task<MyObject> DoSomething();