Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 属性的访问修饰符;为什么';这不是下面的工作吗?_C#_Properties_Access Modifiers - Fatal编程技术网

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; }
}

这将允许程序集中的代码以及其他程序集中的子类获取它(读取)-但只有程序集中的代码可以设置它(写入)。

这里,
受保护的内部
内部
的限制性更小


  • 受保护的内部
    -对于当前程序集和在其他程序集中继承此类型的任何类型都是公共的

  • 内部
    -此程序集为公共程序集,其他程序集为专用程序集


很好的解释;现在对我来说很有意义。