我正面临编译错误,我很难弄清楚为什么编译器无法理解我想要做的事情! :)
它以抽象基类开头:
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>
”
我无法强化派生类中的约束,所以我真的想知道如何排除它!
答案 0 :(得分:2)
您不仅限于MyObject
,而是限制MyObject
派生的任何内容。您从中创建MyOtherObject
并调用DoSomething<MyOtherObject>()
,它会尝试返回Task<MyObject>
,而不是Task<MyOtherObject>
。将Task<MyObject>
隐式投射到Task<MyOtherObject>
是不可能的。所以代码不是有效的,也没有编译。
正如代码目前所示,不需要泛型。签名:
protected abstract Task<MyObject> DoSomething();
满足您的需求。
答案 1 :(得分:0)
覆盖时,覆盖全部。在这种情况下,对T的约束不再有效。