7

当 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 放入模块中,则这些字段将成为该模块的私有字段。这就是您期望模块中的顶级声明的行为方式,但我希望在类型中声明为私有的任何内容都对该类型私有,而不是对其封闭模块私有。

这种行为真的很奇怪,还是我在这里的推理中遗漏了什么?

4

1 回答 1

11

据我所知,这是一个记录不足的功能。但是,规范的第 10.5 节Accessibility Annotations指出:

类型、模块或模块中的类型表示上的私有表示“模块私有”。</p>

“类型表示”是与记录字段相关的部分。

于 2013-01-22T15:26:41.090 回答