当F#记录的字段部分被声明为私有时,我才注意到一种相当反直觉的行为.(这与是否有可能使记录的字段成为私有?或使记录成员成为私有的?)
在这个例子中......
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.
Run Code Online (Sandbox Code Playgroud)
... Both正如预期的那样,私有成员在类型声明范围之外是不可访问的.但是,该字段a是可访问的.
如果将MyRec放入模块中,则该字段将成为该模块的私有字段.这就是你期望模块中的顶级声明表现的方式,但是我预计在一个类型中声明为private的任何东西都是该类型的私有,而不是它的封闭模块.
这种行为实际上是不是很奇怪,或者我在这里的推理中遗漏了什么?
f# ×1