Gibt es eine Möglichkeit, auf gebundene Felder von einem statischen Member zuzugreifen? Der folgende gibt den angezeigten Fehler:
%Vor%Während private explizite Felder den Zugriff von statischen Mitgliedern erlauben:
%Vor%Die Dokumentation Ссылка gibt an, dass "explizite Felder noch nicht für Routinezwecke gedacht sind" Der Zugriff auf private Instanzfelder von statischen Membern ist sicherlich ein Routine-Szenario. Außerdem glaube ich nicht, dass Sie explizite Felder innerhalb eines primären Konstruktors setzen können, was bedeutet, dass, wenn auf ein privates Instanzfeld von einem statischen Mitglied zugegriffen werden muss, alle Felder in explizite Felder verschoben werden müssen und nicht mehr Verwenden Sie einen primären Konstruktor - es ist alles oder nichts.
Als Beispiel für eine reale Welt, in der Sie tatsächlich von einem statischen Element aus auf ein privates Instanzfeld zugreifen möchten, sollten Sie eine große Integer-Implementierung in Betracht ziehen: Eine BigInteger-Klasse wäre unveränderlich, sodass die interne Darstellung der großen Ganzzahl als private Instanz beibehalten würde Feld (nennen wir es data
). Angenommen, Sie fanden eine Add(other)
-Instanzmethode für eine unveränderbare Datenstruktur ungeeignet und wollten nur eine statische Add(lhs,rhs)
-Methode implementieren: In diesem Fall müssten Sie auf lhs.data
und rhs.data
zugreifen können. .
Ich glaube nicht, dass Sie das können ... Tatsächlich können Sie auch von anderen Instanzen auf die gebundenen Werte nicht zugreifen:
%Vor%Wenn Sie auf einen solchen Wert von außerhalb der Instanz zugreifen müssen, zu der er gehört, sollten Sie entweder eine private Eigenschaft erstellen, um den Wert zu erhalten, oder stattdessen ein privates Feld.
UPDATE Dies wird durch Abschnitt 8.6.2 der Spezifikation . Insbesondere:
Instanz "let" -Bindungen sind lexikalisch (und somit implizit privat) für das zu definierende Objekt.
Vielleicht wird jemand aus dem F # -Team eine definitive Antwort darauf geben, warum sich die Sprache so verhält. Ich kann mir jedoch einige mögliche Gründe vorstellen:
Wie bereits erwähnt, sind hier eine ungefähr äquivalente Klassendefinition und Methode zum Erstellen eines Datensatzes:
%Vor% Da Konstruktoren in F # konzeptionell ähnlich wie jede andere Funktion sind, die eine Instanz eines Typs zurückgibt (z. B. können sie ohne new
aufgerufen werden), ist der Aufruf von MyClass 5
konzeptionell ähnlich dem Aufruf von makeMyRecord 5
. Im letzteren Fall erwarten wir eindeutig nicht, dass es eine Möglichkeit gibt, auf die lokale Bindungsbindung für j
von einer anderen Instanz des Datensatzes zuzugreifen. Daher ist es konsistent, dass wir im ersten Fall auch keinen Zugriff auf die Bindung haben.
noch, Zugriff auf gebundene Felder von statische Mitglieder sind sicherlich eine Routine Szenario
Was meinst du hier? Was ist das entsprechende C # -Szenario (mit einem Beispiel)?
Beachten Sie, dass dies legal ist:
%Vor%Das heißt, Sie können den übergebenen Wert als privates Element verfügbar machen, das ein statisches Element lesen / verwenden kann.
Tags und Links f#