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

本文关键字:成员 编译器 错误 继承 隐藏 | 更新日期: 2023-09-27 18:06:01

我正在字符串中执行:

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和网络上,但找不到任何关于这种行为的信息。

如果能对这个问题有任何见解,我将不胜感激。

这是小提琴。

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

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

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

来自MSDN:

抽象方法声明引入了一个新的虚拟方法,但是没有提供该方法的实现。相反非抽象派生类需要提供自己的通过重写方法实现

这个错误的原因是抽象在C#中的工作方式,抽象可以继承,可以实现,但不能隐藏或被另一个抽象取代。

此外,考虑代码:

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

这不会编译,因为:

类型"Base"已定义名为"Execute"的成员参数类型

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