当 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.
...正如预期的那样,私有成员Both
在类型声明范围之外是不可访问的。但是,该字段a
是可访问的。
如果将 MyRec 放入模块中,则这些字段将成为该模块的私有字段。这就是您期望模块中的顶级声明的行为方式,但我希望在类型中声明为私有的任何内容都对该类型私有,而不是对其封闭模块私有。
这种行为真的很奇怪,还是我在这里的推理中遗漏了什么?