跨程序集重写protected internal方法出现CS0507错误的原因咨询
跨程序集重写protected internal方法触发CS0507错误的原因解析
要搞清楚这个问题,核心是理解C#中protected internal修饰符的实际语义——它不是“protected 且 internal”,而是“protected 或 internal”,具体权限范围分两种场景:
- 同程序集内:该成员对当前程序集的所有代码可见(等同于
internal),同时对派生类保持protected权限 - 跨程序集:该成员仅对派生类内部可见(等同于
protected),internal的权限范围无法覆盖其他程序集
同程序集重写无问题的原因
在同一个程序集内,派生类看到的test11()是protected internal权限,重写时使用相同的修饰符,权限范围和原方法匹配,编译器不会报错。
跨程序集重写触发CS0507的原因
当在程序集B中继承程序集A的Person类时:
- 程序集B无法识别
test11()的internal权限部分,只能看到protected权限(因为internal仅对定义它的程序集A生效) - 如果你在程序集B的
uno类中用protected internal重写test11(),相当于试图给重写方法添加原方法在当前上下文没有的internal权限——这违反了C#的重写规则:重写方法的访问权限不能比原方法更宽松(或超出原方法在当前上下文中的可见权限) - 当你把重写的修饰符改为
protected时,权限范围和原方法在程序集B中的可见权限完全匹配,因此错误消失。
内容的提问来源于stack exchange,提问作者Eric Movsessian
相关产品推荐
相关产品推荐

