F#类型的私有修饰符

Gus*_*rra 7 f#

如果我们有

module M

type private A = B | C

(...)
Run Code Online (Sandbox Code Playgroud)

私有修饰符意味着A只能在模块M中使用.但在这种情况下:

namespace N

type private A = B | C

(...)
Run Code Online (Sandbox Code Playgroud)

这个私有修饰符会产生什么影响?CLR命名空间有私有成员是没有意义的,因为命名空间可以随意扩展,那么私有修饰符会有任何影响吗?

Jac*_* P. 7

如果private在命名空间中使用类似的修饰符,它会使类型或模块对文件成为私有 - 也就是说,类型可以被同一文件中的下面的任何内容使用.

编译类型时,F#编译器会将其视为internal.NET元数据.(这是有道理的,因为类型确实是internal- 编译器只强制执行约束,它只能由同一文件中的类型/函数使用.)

我经常使用这个功能BTW - 对于小型助手类型来说很好用,因为它可以防止它们使IntelliSense混乱.

编辑:你可以使用它的另一个很酷的技巧是创建文件范围的"内置"辅助函数.

如果您创建这样的模块,其中的函数将自动可用于其下面的任何内容(由于[<AutoOpen>]),但由于模块已标记,private因此函数不会阻塞您的IntelliSense(处理其他源文件时)或隐藏现有职能.

[<AutoOpen>]
module private Helpers =
    let [<Literal>] blah = "blah"

    let lessThanTwo value =
        value < 2.0
Run Code Online (Sandbox Code Playgroud)