属性上的访问修饰符;以下为什么不工作?

时间:2010-12-15 07:18:04

标签: c# properties access-modifiers

我遇到了一个对我来说没有意义的编译器错误。我有internal属性,我想限制其set块,以便它只能通过继承获得。我认为这样可行:

internal bool MyProperty {
    get { return someValue; }
    protected internal set { someValue = value; }
}

但是编译器说set块上的访问修饰符需要比internal更具限制性 - 我错过了什么,或protected internal 不是internal更具限制性?

4 个答案:

答案 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