2009-06-30 12 views
29

würde Ich mag eine interne Auto-Eigenschaft erstellen:Warum ist intern geschützt nicht restriktiver als intern?

internal bool IP { get; protected internal set; } 

ich dachte, es möglich wäre, den Setter protected oder protected internal zu machen - aber ich bekomme immer den Fehler Zugänglichkeit Modifikator als die restriktiven sein muß Eigenschaft. Ist das nicht der Fall? Private hilft mir hier nicht.

EDIT:
Die Frage ist: Wie implementiere ich eine Auto-Eigenschaft mit einem internen Getter und einem geschützten Setter?

+24

Ihr Fehler ist im Denken der Modifikatoren wie _increasing_ Einschränkungen. Die Modifikatoren sind eigentlich immer _decrease_ restrictions. Denken Sie daran, die Dinge sind standardmäßig "privat"; nur durch Hinzufügen von Modifikatoren machen Sie sie weniger eingeschränkt. –

+1

+1 - eric lippert du hast es immer so gut wie möglich ausgedrückt – JonH

+0

Eigentlich ist die ** Kombination ** von Modifikatoren _abnehmende_ Einschränkungen. Nur ** Einstellung ** ein Modifikator ist in der Tat _creasing_ die Einschränkungen wie 'public bool IP {bekommen; private set;} ' – Dani

Antwort

49

Es ist effektiv protected oder internal, nicht und. Es ist erreichbar beide von abgeleiteten Klassen und Typen in der gleichen Baugruppe. Es ist ein weit verbreitetes Missverständnis zu denken, protected internal bedeutet nur für abgeleitete Klassen in der gleichen Baugruppe zugänglich.

+1

OK, wie mache ich den Getter intern und der Setter geschützt? – tanascius

+2

Sie können nicht. Der Getter/Setter-Zugriffsmodifikator sollte eine geeignete Teilmenge des Eigenschaftszugriffsmodifikators sein. –

+2

Mein Problem war wirklich das Missverständnis, dass geschütztes internes geschütztes UND internes schützt - danke, dass du das herausgibst. – tanascius

2

protected internal ist weniger restriktiv als entweder protected oder internal, weil es erlaubt sowohl seine Unterklassen (protected) und alles, was in der gleichen Anordnung (internal) etwas zuzugreifen.

1

geschützte interne Mittel, die für Klassen in derselben Baugruppe oder für Klassen sichtbar sind, die von der enthaltenen Klasse abgeleitet sind - mit anderen Worten für diejenigen, die die internen Anforderungen ODER die geschützten Anforderungen erfüllen, und nicht UND. Es gibt keinen Zugriffsmodifikator, der auf diese Weise geschützt UND intern bedeutet.

1

geschützt intern bedeutet geschützt ODER intern, nicht geschützt und intern. Daher ist der Gültigkeitsbereich auf die gleiche ODER-Klasse der abgeleiteten Klassen beschränkt, nicht notwendigerweise beides.

29

Auf der .NET-Ebene gibt es zwei ähnliche, aber unterschiedliche Zugriffsebenen:

  • FamilyAndAssembly: restriktiver als entweder geschützt oder interne
  • FamilyOrAssembly: weniger restriktiv als entweder oder interne geschützt

"geschützt intern" in C# bedeutet FamilyOrAssembly; Es gibt keinen Modifikator für FamilyAndAssembly.

So ist Ihr protected internal Setter weniger restriktiv als die internal Gesamteigenschaft. Was Sie tun können ist:

protected internal bool IP { internal get; set; } 

Aber dann Setter ist weniger eingeschränkt als Ihr Getter, die ungerade ist ...

Weitere (etwas Äquivalent) Alternative ist:

internal bool IP { get; set; } 

protected void SetIP(bool ip) 
{ 
    this.IP = ip; 
} 
+0

OK, meine Lösung könnte eine interne schreibgeschützte Eigenschaft mit einem geschützten Hintergrundfeld sein. – tanascius

+0

Oder Ihre gleichwertige Alternative mit einem privaten Setter würde die Arbeit auch tun. – tanascius

+0

Es kommt mir (Monate später natürlich) vor, dass der Setter immer noch "intern" zugänglich ist, was in gewisser Weise weniger einschränkend als geschützt ist. Um es vollständig zu einem internen Getter und einem geschützten Setter zu machen, müßten Sie void SetIP (bool value) und internes bool GetIP() schützen und dann ein privates bool _IP haben – DevinB

0

Accessibility-Modifikator muss restriktiver sein als die Eigenschaft

Intern ist mor e restrictive this protected: weil geschützte Dinge (nach Unterklassen) außerhalb der Assembly gesehen werden können.Der Compiler sagt, dass es keinen Sinn hat zu sagen, dass set geschützt ist (d. H. Sichtbar für Unterklassen außerhalb der Baugruppe), wenn die gesamte Eigenschaft intern ist (d.h. außerhalb der Baugruppe unsichtbar).

5

Ich würde diesen Betrug betrachten, da Eric Lippert auf SO selbst ist, aber er schrieb einen ausgezeichneten Blog-Post, der dieses Problem berücksichtigt.

Why Can't I Access A Protected Member From A Derived Class, Part Three

Letztlich ist seine Antwort weitgehend die gleichen wie die hier von den Plakaten gegeben, aber er Anzeigen einige interessante Gründe für die desgin der Sprache und der Implementierung dieser Funktionen.

+7

Es ist nicht "Betrug". Schreiben Sie auf jeden Fall Links. Es spart mir Zeit. –

5

In Anbetracht, was Jon Skeet erwähnt (und user59808 Kommentar), würde dies nicht das gewünschte Ergebnis erzielen?

protected internal bool IP { get; protected set; }

+0

Ja, so funktioniert es. Thx – tanascius

+0

Obwohl die gewählte Antwort ausführlicher ist, wünschte ich mir, diese Antwort wurde als das, was zu tun, stattdessen enthalten. –

Verwandte Themen