这是我以前从未注意过的事情,但最近遇到过。当我遇到这种情况时,我很惊讶编译器认为是正确的,以及它迫使我做什么。我认为这是最容易通过示例描述的。
让我们说我们有一个通用基类,只有一个方法。
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
!
心。吹。我一直在为这可能背后的原因感到困惑,但我不知所措。有没有人有任何想法?
答案 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
。