当我向基类提供类型参数时,为什么我的子类仍然是通用的?

时间:2014-04-09 21:05:41

标签: c# generics

这是我以前从未注意过的事情,但最近遇到过。当我遇到这种情况时,我很惊讶编译器认为是正确的,以及它迫使我做什么。我认为这是最容易通过示例描述的。

让我们说我们有一个通用基类,只有一个方法。

abstract class GenericBase<T>
{
    public abstract T SomeMethod<T>(T value);
}

这里没什么好疯狂的。现在,让我们扩展它,为int提供具体的实现:

class IntImplementation : GenericBase<int> // T is now, and forever shall be, int
{
    public override int SomeMethod(int value)
    {
        return ++value;
    }
}

看起来很简单吧?或者,所以我想......事实上,你不能这样做。编译器会抛出消息

  

&#39; IntImplementation&#39;没有实现继承的抽象成员&#39; GenericBase.SomeMethod(T)&#39;

但是...... T现在是int!为什么我不能在我的覆盖中替换它?事实证明唯一可接受的覆盖是

public override T SomeMethod<T>(T value)

这意味着我的方法现在必须

public override T SomeMethod<T>(T value)
{
    return ++((int)value);
}
哇,这根本不是通用的。事实上,我不妨从基类中抛弃泛型,并与好的ol&#39; object

心。吹。我一直在为这可能背后的原因感到困惑,但我不知所措。有没有人有任何想法?

1 个答案:

答案 0 :(得分:23)

泛型方法中的T与包含类中的T没有任何关系,您应该收到一条警告,告诉您这一点。 请阅读编译器警告;它们是为了您的利益

如果您希望SomeMethod是通用的,那么您应该写:

abstract class GenericBase<T>
{
    public abstract U SomeMethod<U>(U value);
}

现在很明显,GenericBase<int>根本不会影响SomeMethod<U>

或者,如果您的意图是SomeMethod根本没有通用化,那么不要将其概括为

abstract class GenericBase<T>
{
    public abstract T SomeMethod(T value);
}

现在你可以按照你的描述覆盖SomeMethod