2010-12-15 125 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 - 公衆對本次大會和私人對其他組件