无法隐藏继承的成员编译器错误

时间:2016-09-07 16:38:08

标签: c# abstract-methods method-hiding

我想做:

public abstract class Base
{
    public abstract Task Execute(); 
}

public abstract class Concrete<T> : Base where T : class
{
    new public abstract Task<T> Execute();
}

但由于某种原因,我收到编译错误:

  

CS0533'Concrete.Execute()'隐藏继承的抽象成员'Program.Base.Execute()

我过去隐藏了很多成员,但从未遇到过这方面的情况,我在这里很困惑。花了很长时间在MSDN和网络上,但找不到任何关于这种行为。

我真的很感激有关这个问题的任何见解。

这是the fiddle

2 个答案:

答案 0 :(得分:4)

问题是基本方法是abstract。继承自Concrete<T>的类必须覆盖Base.Execute(),但无法覆盖它,因为它被Derived<T>.Execute()隐藏。因此,Concrete<T>将是一个abstract类,它不可能有任何实现(至少不在C#中),因此它将是无用的。所以,C#编译器不允许你编写它。

如果Base是一个接口,您可以通过使用显式接口实现来解决此问题。但是没有什么比显式基类实现更好的了,所以我认为没有任何方法可以使用这种代码,至少在没有重命名这两种方法之一的情况下。

答案 1 :(得分:1)

来自MSDN:

  

抽象方法声明引入了一个新的虚方法   没有提供该方法的实现。代替,   非抽象派生类需要提供自己的派生类   通过覆盖该方法实现

嗯,这个错误的原因是抽象在C#中是如何工作的,抽象可以被继承,它可以被实现,但它不能被隐藏或被另一个抽象替换。

此外,请考虑代码:

public abstract class Base
{
    public abstract Task Execute();
    public abstract Task<int> Execute();
}

这不会编译,因为:

  

Type'Base'已经定义了一个名为'Execute'的成员   参数类型

那么当我们将第二个方法移动到派生抽象类时,为什么它应该工作呢?