我遇到了一个对我来说没有意义的编译器错误。我有internal
属性,我想限制其set
块,以便它只能通过继承获得。我认为这样可行:
internal bool MyProperty {
get { return someValue; }
protected internal set { someValue = value; }
}
但是编译器说set
块上的访问修饰符需要比internal
更具限制性 - 我错过了什么,或protected internal
不是比internal
更具限制性?
答案 0 :(得分:9)
protected internal
少限制;它受或内部保护(不是和) - 因此另外允许其他程序集的子类访问它。您需要反转:
protected internal bool MyProperty {
get { return someValue; }
internal set { someValue = value; }
}
这将允许程序集中的代码,以及其他程序集中的子类,获取它(读取) - 但只有程序集中的代码可以设置它(写入)。
答案 1 :(得分:3)
来自C#中访问修饰符的documentation:
受保护的内部辅助功能 级别表示受保护或内部,而不是 受保护和内部。其他 单词,受保护的内部成员可以 可以从同一个班级访问 程序集,包括派生类。 限制只能派生的可访问性 声明,同一个程序集中的类 类本身内部,并声明 其成员受到保护。
为了达到预期的效果,您需要交换访问修饰符,如下所示:
protected internal bool MyProperty
{
get { return someValue; }
internal set { someValue = value; }
}
答案 2 :(得分:2)
不,这是两者的结合,而不是交集;因此,protected internal
的限制性要低于两者。交集不是C#的一个特征; CLR支持“Family and Assembly”,但C#仅支持“Family OR Assembly”。
答案 3 :(得分:1)
此处protected internal
限制性较internal
。
protected internal
- 当前程序集的public和在其他程序集中继承此类型的任何类型。
internal
- 此程序集的public和其他程序集的private