2010-12-15 84 views
6

我遇到了一个对我来说不太合理的编译器错误。我有一个internal属性,我想限制它的set块,使它只能通过继承来使用。我认为这会工作:属性访问修饰符;为什么以下工作没有?

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

但是编译器说,set块的访问修饰符需要比internal更加严格 - 我失去了一些东西,或者是protected internalinternal更严格?

回答

9

protected internal限制;它受保护内部(不是) - 因此另外允许其他程序集的子类访问它。你会需要反转:

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

这将允许在你的汇编代码,再加上从其他组件的子类,得到它(读) - 但只有在你的汇编代码可以设置它(写)。

+0

很好的解释;现在对我来说非常有意义。 – 2010-12-15 07:32:25

2

不,这是两者的结合,而不是交集;因此protected internal比两者都不那么严格。该交集不是C#的一个特性; CLR确实支持“Family和Assembly”,但C#仅支持“Family或Assembly”。

3

documentation上访问修饰符在C#:

的保护内部的无障碍 级别来保护或内部,不 保护和内部。在其他 单词中,受保护的内部成员可以从同一 程序集的任何类访问,其中包括派生类。 为了限制对同一个程序集中只有衍生的 类的可访问性,声明 该类本身是内部的,并将其成员声明为 受保护。


为了达到预期的效果,而不是你需要交换访问修饰符,就像这样:

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

这里,protected internal限制较少,internal

  • protected internal - 公共电流组件和继承这种类型的其他组件的任何类型。

  • internal - 公众对本次大会和私人对其他组件