Esiste un modo per accedere ai campi associati da un membro statico? Di seguito dà l'errore indicato:Accesso ai campi associati ai membri statici
type Foo(x) =
let x = x
static member test() =
let foo = Foo(System.DateTime.Now.Month)
printfn "%A" foo.x //the field, constructor or member 'x' is not defined
()
Mentre campi esplicite private non consentire l'accesso da membri statici:
type Bar =
val private x:int
new(x) = { x=x }
static member test() =
let Bar = Bar(System.DateTime.Now.Month)
printfn "%A" Bar.x
()
La documentazione http://msdn.microsoft.com/en-us/library/dd469494.aspx afferma che "i campi espliciti non sono destinati per l'uso di routine", ma l'accesso ai i campi di istanze private da membri statici sono certamente uno scenario di routine. Inoltre, non credo che sia possibile impostare campi espliciti all'interno di un costruttore principale, il che significa che se è necessario accedere anche a un campo di un'istanza privata da un membro statico, tutti i campi devono essere spostati su campi espliciti e non è più possibile usa un costruttore principale - è tutto o niente.
Come esempio del mondo reale in cui si desidera effettivamente accedere a un campo di istanza privato da un membro statico, considerare un'implementazione di un intero intero: una classe BigInteger sarebbe immutabile, quindi la rappresentazione interna del grande intero sarebbe mantenuta come privato campo istanza (chiamiamolo data
). Supponiamo ora di ritenere inappropriato un metodo di istanza Add(other)
per una struttura di dati immutabile e si desidera implementare solo un metodo statico Add(lhs,rhs)
: in questo caso, sarà necessario poter accedere a lhs.data
e a rhs.data
.
Esiste qualche motivo tecnico o logico per cui i campi associati devono comportarsi in modo diverso in questo senso rispetto ai campi privati espliciti? –
@Stephen: vedere il mio aggiornamento per la speculazione sul motivo per cui questo approccio potrebbe essere stato preso. – kvb
grazie. il fatto che siano lessicalmente limitati limita la capacità del compilatore di scoprirli come campi in questi scenari (fa "implicitamente privato" = nascosto)? –