我想在派生类中覆盖泛型方法。问题是,我希望有一个具体的类型参数实现:
namespace Stumped
{
public class Generic<T> where T : new()
{
public virtual T Foo()
{
return new T();
}
public virtual TAnother GenericMethod<TAnother>() where TAnother : new()
{
return new TAnother();
}
}
public class Concrete : Generic<Inner1>
{
// Concrete return type. Works as expected.
public override Inner1 Foo()
{
return base.Foo();
}
// Why doesn't this make sense? Shows 'Type parameter "Inner2" hides class "Inner2"'.
public override Inner2 GenericMethod<Inner2>()
{
return base.GenericMethod<Inner2>();
}
}
public class Inner1 { }
public class Inner2 { }
}
如上所述,编译器告诉我:
类型参数“Inner”隐藏类“Inner”
我希望我的实现能够工作,而不必在这个派生类中使用另一个泛型参数。
为什么这没有意义?
答案 0 :(得分:2)
你完全不能这样做。
覆盖方法不能改变方法界面的任何部分。由于GenericMethod<OtherClass>()
对基类有效,因此它也必须对派生类有效。
这称为Liskov substitution principle 。
当编译器警告你时,你实际上只是声明了一个恰好与你的类名相同的普通类型参数。