在嵌套的内部类中重写操作符
本文关键字:重写 操作符 内部类 嵌套 | 更新日期: 2023-09-27 18:10:44
我需要在可访问性为internal
的嵌套类中重写Equals
操作符(因此,GetHashcode
方法)。
当我尝试这样做时,编译器抱怨我不能用private
方法覆盖Equals(一个public
成员)。但是我不能重写public
,因为类本身是internal
,并且嵌套。
如何做到这一点?我如何在一个不是public
的类中覆盖Equals
和GetHashcode
(事实上,是嵌套的和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() {}}