You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 15:32:17