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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 11:45:45