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