【发布时间】:2011-03-07 03:36:52
【问题描述】:
有没有办法从静态成员访问 let 绑定字段?以下给出了指示的错误:
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
()
而私有显式字段确实允许静态成员访问:
type Bar =
val private x:int
new(x) = { x=x }
static member test() =
let Bar = Bar(System.DateTime.Now.Month)
printfn "%A" Bar.x
()
文档http://msdn.microsoft.com/en-us/library/dd469494.aspx 声明“显式字段不适合常规使用”,但从静态成员访问私有实例字段肯定是常规场景。此外,我不相信您可以在主构造函数中设置显式字段,这意味着即使需要从静态成员访问一个私有实例字段,您的所有字段都必须移至显式字段,并且您不能再使用主构造函数——要么全有,要么全无。
作为实际示例,您实际上希望从静态成员访问私有实例字段,请考虑大整数实现:BigInteger 类将是不可变的,因此大整数的内部表示将保留为私有实例字段(我们称之为data)。现在,假设您认为Add(other) 实例方法不适用于不可变数据结构,并且您只想实现静态Add(lhs,rhs) 方法:在这种情况下,您需要能够访问lhs.data 和rhs.data .
【问题讨论】:
标签: f#