我想不出一个实例,其中受保护的方法应该与密封类中的私有方法的行为不同.
但是:
public abstract class Base
{
protected abstract void Foo();
}
public sealed class Derived : Base
{
// Error CS0507: cannot change access modifiers when
// overriding 'protected' inherited member
// public override void Foo() {}
// Error CS0621: virtual or abstract members cannot be private
// private override void Foo() {}
// Compiles just fine.
protected override void Foo() {}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,编译器面临两个看似奇怪的选择
private override
这有点不敏感,因为虚拟方法永远不应该是私有的 protected override
这有点不敏感,因为受保护的方法永远不应该以密封类型声明 选项#1会有点奇怪,因为它在其他地方(私有虚拟)采取了一些错误,并且在这种特定情况下使其成为非错误.选项#2虽然在编译器中不需要特殊规则.在密封类型中声明受保护的成员总是合法的,这样做有点奇怪(发出警告).因此编译器选择了两个奇数语法中较小的一个