无法隐藏继承的成员编译器错误
本文关键字:成员 编译器 错误 继承 隐藏 | 更新日期: 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"的成员参数类型
那么,当我们将第二个方法移动到派生的抽象类时,为什么它应该起作用呢?