为何C#子类可覆盖internal const却无法覆盖protected const?
C#子类internal const和protected const行为差异解析
先明确两个核心前提:
const是编译期静态常量,所有对它的访问都会在编译阶段直接绑定到具体值,完全没有运行时动态解析的过程。- C#对
protected成员的访问权限有严格限制,尤其是静态protected成员。
为什么B.iStr能拿到"childI"
internal成员在同一程序集内是全局可见的。父类A的foo方法里访问B.iStr时,编译器能直接找到子类B里定义的internal new const string iStr,所以编译时直接把s绑定到B.iStr的"childI"。
为什么B.pStr拿到的是"baseP"
问题出在protected静态成员的访问规则上:
- 在父类
A中,你不能通过子类B的类型来访问B的protected静态成员。因为A是B的基类,不是B的子类,不符合protected成员的访问权限要求。 - 编译器处理
B.pStr时,找不到B里的protected new const string pStr,只能退而求其次,绑定到基类A中自己的protected const string pStr,所以最终拿到的是"baseP"。
额外说明
你代码里的new关键字只是隐藏了基类的成员,不是"覆盖"——const本身是静态编译期常量,根本不支持多态覆盖,new只是告诉编译器你是故意隐藏基类成员,避免触发警告而已。
如果想在父类里拿到子类的protected常量,几乎没有可行的方式:因为const是静态的,不能通过实例访问;而通过子类类型访问又受protected权限限制。如果要实现类似"子类重写常量"的效果,你得换成protected static readonly(运行时绑定),但这和const的编译期特性已经完全不同了。
内容的提问来源于stack exchange,提问作者skubany
相关产品推荐
相关产品推荐

