C#中定义internal类型的protected属性遇可访问性错误求解
解决C#中internal类型作为public类protected属性的访问性冲突问题
错误原因
你遇到的「Inconsistent accessibility」错误,核心是访问修饰符的范围不匹配:
protected internal的实际访问范围是当前程序集内的所有代码 + 任意程序集中的MyClass子类- 但
InternalClass是internal,仅能在当前程序集内访问
如果其他程序集存在MyClass的子类,该子类能看到protected internal修饰的属性,但无法访问属性的类型InternalClass,这种矛盾的访问性被编译器禁止。
正确用法
根据需求(InternalClass为internal,在public类MyClass中定义类型为它的protected属性),需要限制属性的访问范围,确保只有能访问InternalClass的代码才能访问该属性,具体分两种场景:
场景1:仅允许当前程序集内的MyClass子类访问属性
使用private protected修饰属性(C# 7.2及以上版本支持),它的访问范围是当前程序集内的MyClass子类,完全匹配InternalClass的访问范围:
internal class InternalClass { // 类实现代码 } public class MyClass { private protected InternalClass IC { get; set; } } // 当前程序集内的子类可正常访问 public class MyDerivedClass : MyClass { public void AccessProperty() { var icInstance = IC; // 合法,满足当前程序集+子类的访问条件 } }
场景2:允许当前程序集内所有代码访问属性(含非子类)
如果需求是当前程序集内任意代码都能访问该属性,同时保留子类访问权限(仅限当前程序集内的子类),可以直接用internal修饰属性:
internal class InternalClass { // 类实现代码 } public class MyClass { internal InternalClass IC { get; set; } } // 当前程序集内的任意代码都可访问 public class TestClass { public void AccessProperty() { var myObj = new MyClass(); var icInstance = myObj.IC; // 合法 } } // 当前程序集内的子类也可访问 public class MyDerivedClass : MyClass { public void AccessProperty() { var icInstance = IC; // 合法 } }
关键说明
不要混淆protected internal和private protected:
protected internal是「或」逻辑:满足子类或当前程序集即可访问private protected是「与」逻辑:必须同时满足子类且当前程序集才能访问
前者会允许跨程序集的子类访问属性,而这些子类无法访问InternalClass,这就是报错的根源;后者则完美适配InternalClass的internal访问限制。
内容的提问来源于stack exchange,提问作者Hooman Bahreini
相关产品推荐
相关产品推荐

