在嵌套的内部类中重写操作符

本文关键字:重写 操作符 内部类 嵌套 | 更新日期: 2023-09-27 18:10:44

我需要在可访问性为internal的嵌套类中重写Equals操作符(因此,GetHashcode方法)。

当我尝试这样做时,编译器抱怨我不能用private方法覆盖Equals(一个public成员)。但是我不能重写public,因为类本身是internal,并且嵌套。

如何做到这一点?我如何在一个不是public的类中覆盖EqualsGetHashcode(事实上,是嵌套的和internal)?

在嵌套的内部类中重写操作符

我不知道为什么它工作,虽然。

此行为在c#规范§3.5.2中定义:

在程序P中,在类型T中声明的嵌套成员M的可访问域定义如下(注意M本身可能是一个类型):[…]

  • 如果M的可访问性声明为internal,则M的可访问性域为T的可访问性域与P的程序文本的交集。

该规定要求,对于具有内部可访问性的类,类型成员可以等效地标记为public或internal。

不能有访问级别高于其包含类的成员?

这是准确的;该规范的同一部分指出,"成员的可访问域永远不会比声明成员的类型的可访问域更具包容性"。重要的是要认识到,尽管语言允许将具有内部可访问性的类型的成员声明为public,但它仍然具有内部可访问性(就好像它被声明为内部一样)。

也就是说,在下面的代码段中,X的可访问性在两行中是相等的:

internal class A {public void X() {}}
internal class A {internal void X() {}}