使用泛型返回类型覆盖虚方法

时间:2011-10-12 23:36:45

标签: c# generics

考虑这两个抽象类。 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的方法?

3 个答案:

答案 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;
}