¿Hay alguna forma de acceder a los campos enlazados de un miembro estático? A continuación se presenta el error indicado:Acceder a dejar los campos vinculados de los miembros estáticos
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
()
mientras que los campos explícitos privados no permitir el acceso de los miembros estáticos:
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 documentación http://msdn.microsoft.com/en-us/library/dd469494.aspx establece que "los campos explícitos no están destinados para su uso rutinario," sin embargo, el acceso a los campos privados de instancias de miembros estáticos son ciertamente un escenario de rutina. Además, no creo que pueda establecer campos explícitos dentro de un constructor primario, lo que significa que si se necesita acceder a un campo de instancia privada desde un miembro estático, todos sus campos se deben mover a campos explícitos y ya no se puede usa un constructor primario: es todo o nada.
Como ejemplo del mundo real donde realmente desearía acceder a un campo de instancia privada de un miembro estático, considere una implementación de entero grande: una clase BigInteger sería inmutable, por lo que la representación interna del entero grande se mantendría como privada campo de instancia (llamémoslo data
). Ahora, supongamos que sintió que un método de instancia Add(other)
era inapropiado para una estructura de datos inmutables y que solo quería implementar un método estático Add(lhs,rhs)
: en este caso, tendría que poder acceder a lhs.data
y rhs.data
.
¿Hay alguna razón técnica o lógica por la que los campos enlazados se comporten de manera diferente en este aspecto a los campos privados explícitos? –
@Stephen: consulta mi actualización para obtener información sobre por qué se ha llevado a cabo este enfoque. – kvb
gracias. El hecho de que tengan un alcance léxico limita la capacidad del compilador para descubrirlos como campos en estos escenarios (¿"implícitamente privado" = oculto)? –