2010-12-15 7 views
6

Ich bin auf einen Compilerfehler gestoßen, der für mich keinen Sinn ergibt. Ich habe eine internal Eigenschaft und ich möchte seinen set Block so beschränken, dass er nur durch Vererbung verfügbar ist. Ich dachte, das würde funktionieren:Zugriffsmodifizierer für Eigenschaften; Warum funktioniert die folgende Arbeit nicht?

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

Aber der Compiler sagt, dass der Zugriffsmodifikator auf dem set Block restriktiver als internal sein muss - ich bin etwas fehlt, oder ist protected internalnicht restriktiver als internal?

Antwort

9

protected internal ist weniger restriktiv; Es ist geschützt oder interne (nicht und) - die daher zusätzlich ermöglicht Unterklassen von anderen Baugruppen Zugriff darauf. Sie würden umkehren müssen:

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

Dieser Code in der Assembly ermöglicht plus Subklassen von anderen Baugruppen, erhalten es (lesen) - aber nur Code in Ihrer Assembly einstellen es (schreiben).

+0

Große Erklärung; macht jetzt vollkommen Sinn für mich. –

2

Nein, es ist die Vereinigung der beiden, nicht die Kreuzung; Daher ist protected internal weniger restriktiv als beide einzeln. Die Kreuzung ist kein Merkmal von C#; Die CLR unterstützt "Family AND Assembly", aber C# unterstützt nur "Family OR Assembly".

3

Vom documentation auf Zugriffsmodifizierer in C#:

Die geschützte interne Zugänglichkeit Ebene Mittel geschützt oder intern, nicht geschützt und interne. In anderen Worten kann auf ein geschütztes internes Mitglied von jeder Klasse in derselben Assembly zugegriffen werden, einschließlich abgeleiteter Klassen. Um die Zugreifbarkeit auf nur abgeleitete Klassen in derselben Baugruppe zu beschränken, deklarieren Sie die Klasse selbst intern und deklarieren Sie ihre Mitglieder als geschützt.


die gewünschte Wirkung zu erzielen, müssen Sie stattdessen die Zugriffsmodifikatoren tauschen, etwa so:

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

Hier ist protected internal weniger restriktiv als internal.

  • protected internal - Öffentlichkeit für aktuelle Assembly und jede Art, die diese Art in anderen Baugruppen erbt.

  • internal - Öffentlichkeit für diese Montage und privat für andere Baugruppen

Verwandte Themen