C# 属性的访问修饰符;为什么';这不是下面的工作吗?
我遇到了一个编译器错误,这个错误对我来说意义不大。我有一个C# 属性的访问修饰符;为什么';这不是下面的工作吗?,c#,properties,access-modifiers,C#,Properties,Access Modifiers,我遇到了一个编译器错误,这个错误对我来说意义不大。我有一个internal属性,我想限制它的set块,使其仅通过继承可用。我认为这会奏效: internal bool MyProperty { get { return someValue; } protected internal set { someValue = value; } } 但是编译器说,集合块上的访问修饰符需要比内部更严格-我是否遗漏了什么,或者受保护的内部没有比内部更严格?不,这是两者的结合,而不是交叉点;因
internal
属性,我想限制它的set
块,使其仅通过继承可用。我认为这会奏效:
internal bool MyProperty {
get { return someValue; }
protected internal set { someValue = value; }
}
但是编译器说,
集合
块上的访问修饰符需要比内部
更严格-我是否遗漏了什么,或者受保护的内部
没有比内部
更严格?不,这是两者的结合,而不是交叉点;因此,受保护的内部
比这两个单独的内部限制更小。交叉点不是C#的特征;CLR不支持“族和程序集”,但C#仅支持“族或程序集”。来自C#中的on-Access修饰符:
受保护的内部可访问性
级别是指受保护的或内部的,而不是
受保护且内部。其他
换句话说,受保护的内部成员可以
可以从同一数据库中的任何类访问
程序集,包括派生类。
将可访问性限制为仅派生
同一程序集中的类,声明
类本身是内部的,并声明
其成员受到保护
为了达到预期效果,您需要交换访问修饰符,如下所示:
protected internal bool MyProperty
{
get { return someValue; }
internal set { someValue = value; }
}
受保护的内部
限制较少;它受到或内部(而不是和)的保护,因此还允许来自其他程序集的子类访问它。您需要反转:
protected internal bool MyProperty {
get { return someValue; }
internal set { someValue = value; }
}
这将允许程序集中的代码以及其他程序集中的子类获取它(读取)-但只有程序集中的代码可以设置它(写入)。这里,
受保护的内部
比内部
的限制性更小
-对于当前程序集和在其他程序集中继承此类型的任何类型都是公共的受保护的内部
-此程序集为公共程序集,其他程序集为专用程序集内部