当F#记录的字段部分被声明为私有时,我才注意到一种相当反直觉的行为。 (这与Is it possible to make a field of a record private? or to make a member of record private?)
有关在这个例子中......
type MyRec =
private // Fields declared private, or at least I thought so.
{ a : int
b : int }
member x.A = x.a
member private x.Both = x.a + x.b
static member CreateMyRec(a, b) = { a = a; b = b }
let foo = MyRec.CreateMyRec(1,2)
let bar = foo.a // No error. Huh?
let baz = foo.Both // Error: not accessible.
...如预期的那样,私有成员Both
在类型声明范围之外是不可访问的。但是,可以访问字段a
。
如果将MyRec放入模块中,则该字段将成为该模块的私有字段。这就是你期望模块中的顶级声明的行为方式,但我预计在一个类型中声明为private的任何东西都是该类型的私有,而不是它的封闭模块。
这种行为实际上是不是很奇怪,或者我在这里的推理中遗漏了什么?
答案 0 :(得分:10)
据我所知,这是一个记录不足的功能。但是,规范的第10.5节Accessibility Annotations指出:
模块中的类型,模块或类型表示的私有意味着“对模块是私有的。”
“类型表示”是与记录字段相关的部分。