这是我以前从未注意到的,但最近碰到。当我遇到这种情况时,我惊讶于编译器认为是正确的,以及它迫使我做什么。我认为这是最容易通过例子来描述。当我向基类提供一个类型参数时,为什么我的子类仍然是泛型的?
比方说我们有一个通用的基类与单一的方法。
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;
}
}
看起来很简单,对不对?或者,所以我想......其实,你不能做到这一点。编译器会引发你的消息
'IntImplementation' 不实现继承的抽象成员 'GenericBase.SomeMethod(T)'
但是......现在T
是int
!为什么我不能在我的重写中替换这个?原来,只有接受倍率
public override T SomeMethod<T>(T value)
这意味着我的方法现在已经是
public override T SomeMethod<T>(T value)
{
return ++((int)value);
}
哇,这不是一般的。事实上,我可能会从基础类沟渠泛型,并与良好的醇'object
!
介意。吹。我一直在困惑这背后的原因,但我无所适从。有人有任何想法吗?
**这里没有什么疯狂的**?当然不是!你已经声明了两个不同的泛型类型参数,都被称为'T'。请不要这样做。你应该得到一个编译器警告,告诉你这是一个不好的做法,会导致代码混淆。 –
我在一个答案和评论中得到了。这不公平。 :/ Dat泛型类型参数范围.... – Will