无法隐藏继承的成员编译器错误
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 ?
我想做 :
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 ?