繁体   English   中英

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

[英]Access modifiers on properties; why doesn't the following work?

我遇到了一个编译器错误,这对我来说没有任何意义。 我有一个internal属性,我想限制它的set块,使其只能通过继承使用。 我认为这可以工作:

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

但是编译器说,在访问修饰符set块需要比更严格的internal -我失去了一些东西,或者是protected internal 超过限制性internal

protected internal限制较少 它是受保护内部(未 ) -因此其另外允许从其他组件的子类进行访问。 您将需要反转:

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

这将允许您程序集中的代码以及其他程序集中的子类获取 (读取)-但只有程序集中的代码才能对其进行设置 (写入)。

从有关C#中的访问修饰符的文档中:

受保护的内部可访问性级别表示受保护的或内部的,而不是受保护的内部。 换句话说,可以从同一程序集中的任何类(包括派生类)访问受保护的内部成员。 为了将可访问性限制为仅允许同一程序集中的派生类,请声明该类本身为内部,然后将其成员声明为受保护。


为了达到理想的效果,您需要交换访问修饰符,如下所示:

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

不,这是两者的结合,而不是交集。 因此, protected internal限制要比单独protected internal限制少。 交集不是C#的功能; CLR确实支持“ Family AND Assembly”,但是C#仅支持“ Family OR Assembly”。

在这里, protected internal限制要比internal限制少。

  • protected internal -对当前程序集以及在其他程序集中继承此类型的任何类型都是公共的。

  • internal -此程序集为公共,其他程序集为私有

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM