FEHLER: Der Accessibility-Modifikator des Mengenaccessors muss restriktiver sein als die Eigenschaft oder der Indexer

8

Ich habe ein bisschen Verwirrung mit Eigentum Accessoren.

Ich hätte gerne eine interne Eigenschaft mit dem Set-Accessor, auf die nur abgeleitete Klassen zugreifen können.

so etwas

%Vor%

Wenn ich das mache, beschwert sich der Compiler.

MSDN schlägt bei der Erörterung dieses speziellen Fehlers vor, den Zugriffsmodifizierer set auf private

zu ändern

Das ist nicht wo ich möchte, dass das geht.

Es sieht so aus, als ob Protected Internal hier eine Option sein sollte, aber die Verwendung dieses Modifikators gibt denselben Fehler

Ich habe das Gefühl, dass mir ein grundlegendes Verständnis von Zugriffsmodifizierern fehlt.

Danke

    
Beta033 20.07.2010, 17:24
quelle

3 Antworten

10

Weder protected noch protected internal sind restriktiver als internal . Beides würde abgeleitete Typen einer anderen Assembly auf den Setter aber nicht auf den Getter zugreifen lassen. protected internal ermöglicht den Zugriff auf die union von protected und internal , nicht die -Kreuzung . (Es gibt eine Zugriffsebene, die die Schnittmenge in der CLR darstellt, sie wird jedoch von C # nicht angezeigt.)

Am besten ist es, wenn Sie einen privaten Setter und eine geschützte Methode SetMyProperty verwenden, die den privaten Setter aufruft, wenn er dem entspricht, was Sie erreichen wollen.

    
Jon Skeet 20.07.2010, 17:27
quelle
2

Intern ist restriktiver als geschützt. Intern macht das Member auf die aktuelle Assembly beschränkt, während protected für eine beliebige große Anzahl von Nachkommen außerhalb Ihrer Assembly zugänglich ist.

Wenn diese Eigenschaft für Klassen oder Nachkommen außerhalb Ihrer Assembly zugänglich sein soll, müssen Sie das interne Attribut für die Eigenschaft verlieren. Wenn Sie beabsichtigen, dass diese Eigenschaft nur in Ihrer Assembly verwendet wird, müssen Sie die Eigenschaft Accessor intern verwenden.

Das bedeutet leider, dass Sie auf dem Accessor von internen Eigenschaften geschützt aufgeben müssen. Das ist eine Irritation, denn obwohl die Eigenschaft auf Clients innerhalb Ihrer Assembly beschränkt ist, bedeutet das nicht, dass Sie all diesen Clients wirklich vertrauen, dass sie Ihre Property korrekt verwenden. Es macht Sinn, wenn Sie als einziger Autor im Quelltext Ihrer Assemblierung herumlaufen, aber ich würde viel lieber die geschützte Semantik interner Klassen beibehalten, wenn Hunderte von Entwicklern im Quellcode einer großen Assembly herumlaufen.

    
dthorpe 20.07.2010 17:40
quelle
0

Aus irgendeinem Grund scheint der Compiler zu glauben, dass eine interne Klasse abgeleitete Klassen in anderen Assemblys haben darf. Das geschützte Feld wird dann für andere Assemblys durch die abgeleitete Klasse als verfügbar betrachtet (dh das Feld hat kein Konzept für den Zugriffsmodifikator seiner Klasse). Der Compiler-Fehler soll anzeigen, dass das angegebene Feld seine Zugriffsrechte übertrifft (obwohl Sie wissen, dass es nie passieren wird).

    
TreDubZedd 20.07.2010 17:34
quelle

Tags und Links