F#将内部模块视为私有

时间:2011-09-06 15:48:13

标签: .net f# module visibility

为什么以下内容无法编译?

在最后一行,它告诉我Module1未定义。如果我从Module1中删除“内部”,它可以正常工作。

我有两个代码文件,Module1.fs在项目中的Module2.fs之上。

Module1.fs

module internal Module1

let sample =
    5 + 4

Module2.fs

module Module2

let sample2 =
    3 + Module1.sample

3 个答案:

答案 0 :(得分:7)

您需要为模块命名,以便internal模块对以后的模块可见。

let module internal MyNamespace.Module1
let module MyNamespace.Module2

答案 1 :(得分:4)

编译器错误

虽然这里的答案是解决方法,但这种行为仍然是编译器错误。阅读文档和Don Syme的专家F#,毫无疑问只有在您使用namepsaces 时才能访问内部模块中的类型

考虑到编译器发出的代码,我不会觉得在内部模块中的类型在程序集内部可见是很困难的。

修改 将此行为提交给@fsbugs后,主人本人Don Syme很快证实这是一个错误。我为这个案例添加了一个工作项目:

https://visualfsharp.codeplex.com/workitem/29

答案 2 :(得分:2)

这应该是命名空间问题。 只需在两个文件(相同的名称空间!)之上添加名称空间定义,如下所示:

namespace MyNamespace

module internal Module1 =

let sample = 5+4

namespace MyNamespace

module Module2 =

let sample2 = 3 + Module1.sample