ECMA-335规范中嵌套类型成员可访问性规则的执行疑惑
关于ECMA-335规范与C#嵌套类型成员可访问性的疑问解答
你并没有误解ECMA-335第6版I.8.5.3.2的规范,C#的编译行为是有合理依据的,核心在于对规范规则实际可访问范围的理解:
规范规则的本质
ECMA-335中规定的「嵌套类型的成员/子嵌套类型的可访问性不得高于包含它的嵌套类型」,指的是实际可被访问的范围,而非单纯的可访问性修饰符字面比较。规则的核心意图是避免出现「嵌套类型的成员能被比嵌套类型本身更广泛的代码访问」的情况。
你的代码示例分析
在你提供的代码中:
internal class EnclosingType { private class NestedType { public int publicField; } }
NestedType是private嵌套类型,它的可见范围仅局限于EnclosingType内部,对外部代码完全不可见。- 尽管
publicField标记为public,但由于NestedType本身的可见性限制,外部代码根本无法获取NestedType的实例,自然也无法访问这个字段。它的实际可访问范围依然被限制在EnclosingType内部,并没有超过包含它的嵌套类型的可访问范围。
C#编译器的行为逻辑
C#编译器允许这种写法,是因为它并没有违反规范的核心约束。编译器会保留代码中显式声明的修饰符,但在运行时,CLI会通过嵌套类型的可见性自动限制其成员的实际访问范围——也就是说,即使字段标记为public,外部代码也无法突破NestedType的private限制去访问它。
内容的提问来源于stack exchange,提问作者Ivan Petrov
相关产品推荐
相关产品推荐

