当F#记录的字段被声明为私有时,奇怪的可访问性范围

时间:2013-01-22 15:10:59

标签: f#

当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的任何东西都是该类型的私有,而不是它的封闭模块。

这种行为实际上是不是很奇怪,或者我在这里的推理中遗漏了什么?

1 个答案:

答案 0 :(得分:10)

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

  

模块中的类型,模块或类型表示的私有意味着“对模块是私有的。”

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