Gibt es eine gute Möglichkeit für eine Inline -Funktion, auf private oder interne Werte zuzugreifen?

StackOverflow https://stackoverflow.com/questions/4824536

  •  26-10-2019
  •  | 
  •  

Frage

Ich bin gerade auf ein Problem gestoßen: Wenn ich versuche, aus einer Inline -Funktion auf einen privaten oder internen Wert zugreifen zu können, erhalte ich den Fehler "Der Wert 'xxx' wurde inline gekennzeichnet, aber seine Implementierung nutzt eine interne oder private Funktion, die nicht ausreichend ausreicht zugänglich". Während ich logisch logisch bin, frage ich mich, ob jemand eine gute Arbeit hat. Das Beste, was ich mir vorstellen kann, ist, die Werte öffentlich in ein verschachteltes Modul zu legen und nur zu hoffen, dass niemand herumstößt (worüber ich mich sowieso keine Sorgen mache, da diese Werte unveränderlich sind). Ich nehme an, Reflection ist eine Option, aber ohne Cache -Anrufe (mit ... privaten Delegierten) zu können, ist der Leistungsschlag zu viel.

War es hilfreich?

Lösung

Kurze Antwort: Nein, da der Wert in der Call-Site inline eingefügt wird, kann er keine privaten Werte verwenden und es gibt keine wirkliche Möglichkeit, um sie herum zu arbeiten.

Längere Antwort: Wenn es Ihnen nichts ausmacht, einen unglaublich hässlichen Code zu schreiben und den Aufwand einiger Methodenaufrufe pro Verwendung zu verarbeiten, besteht eine Alternative darin, eine dynamische Implementierung zu erstellen (z. OperatorIntrinsics.AbsDynamicTableImpl in der Kernbibliothek), die privat sein kann. Sie können dann die dynamische Implementierung in eine öffentliche undurchsichtige generische Methode einwickeln (z. B. OperatorIntrinsics.AbsDynamic<'T>) und erstellen Sie dann einen Inline -Wert, der die richtig let inline abs< ^t when ^t : (static member Abs : ^t -> ^t)> x = AbsDynamic x). Nun, wenn Sie inline abs Sie sehen nur einen Anruf bei AbsDynamic aber keine der weiteren Implementierungsdetails. In den meisten Fällen würde ich erwarten, dass dies eine viel schlechtere Lösung ist, als nur Ihren Wert öffentlich anstatt privat zu machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top