考虑这两个抽象类。 MyClass2扩展了我的BaseClass并覆盖了一个虚方法。注意它还将MyBaseClass的TValue定义为IList ...
public abstract class MyBaseClass<TKey, TValue>
{
public virtual IList<TValue> DoSomeStuff()
{
IList<TValue> result;
....
return restult;
}
}
public abstract class MyClass2<TKey, TValue>: MyBaseClass<TKey, IList<TValue>>
{
public override IList<TValue> DoSomeStuff()
{
IList<TValue> result;
....
return restult;
}
}
此代码无法编译。投诉是关于MyClass2.DoSomeStuff的返回类型。错误是“覆盖方法时无法更改返回类型”IList<TValue> MyClass2<TKey, TValue>.DoSomeStuff()
“
我不清楚为什么这是错的。为什么编译或.net认为TValue的重写方法不是MyClass2的方法?
答案 0 :(得分:3)
您的子类继承的基类的TValue
参数实际上是您的子类声明的IList<TValue>
。内部TValue
属于您的子类。
因此,如果您尝试覆盖属于基类的现有虚方法,则返回类型实际上应为IList<IList<TValue>>
;也就是说,属于您的基类的IList
的{{1}},而不是子类。
答案 1 :(得分:3)
基类部分的问题:
public abstract class MyClass2<TKey, TValue>: MyBaseClass<TKey, IList<TValue>>
将IList<TValue>
替换为TValue
,它会起作用 - 该方法已经返回IList
。
答案 2 :(得分:1)
您收到错误是因为子类中的TValue
实际上是基类中的IList<TValue>
所以方法签名(作为您的基类会看到它)将是IList<IList<TValue>>
这显然与虚方法的签名不匹配。
要获得匹配类型,您必须更改签名:
public override TValue DoSomeStuff()
{
TValue result;
return result;
}