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

Cannot hide inherited member compiler error

我想做 :

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()' hides inherited abstract member 'Program.Base.Execute()

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

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

这里是the fiddle

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

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

来自 MSDN:

An abstract method declaration introduces a new virtual method but does not provide an implementation of that method. Instead, non-abstract derived classes are required to provide their own implementation by overriding that method

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

此外,考虑代码:

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

这不会编译,因为:

Type 'Base' already defines a member called 'Execute' with the same parameter types

那么为什么当我们将第二个方法移动到派生抽象时它会起作用 class ?