Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当F#record';s字段被声明为私有_F# - Fatal编程技术网

当F#record';s字段被声明为私有

当F#record';s字段被声明为私有,f#,F#,我刚刚注意到,当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 Crea

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


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

据我所知,这是一个文档不足的特性。但是,规范第10.5节规定:

模块中的类型、模块或类型表示的专用表示“模块专用”


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

这是一个微妙的部分。如果没有你的回答,我是不会注意到的。