覆盖具体类型的通用方法(类型参数*隐藏类*)

时间:2016-06-02 19:10:48

标签: c# generics inheritance type-parameter

我想在派生类中覆盖泛型方法。问题是,我希望有一个具体的类型参数实现:

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”

我希望我的实现能够工作,而不必在这个派生类中使用另一个泛型参数。

为什么这没有意义?

1 个答案:

答案 0 :(得分:2)

你完全不能这样做。

覆盖方法不能改变方法界面的任何部分。由于GenericMethod<OtherClass>()对基类有效,因此它也必须对派生类有效。

这称为Liskov substitution principle

当编译器警告你时,你实际上只是声明了一个恰好与你的类名相同的普通类型参数。