3

来自F# 4.0 规范 [PDF]

所有非公共实体的 CLI 编译形式为internal.

在我的主要项目中,我有一个定义为的函数

namespace MyNamespace.Foo
module Bar =
  module Baz =
    let private myFun ...

在主项目的“AssemblyInfo.fs”中,我有

[<assembly: InternalsVisibleTo("MyNamespace.Tests")>]

(我已经仔细检查了这个名字。)

但是,在测试程序集(也是 F#)中,如果myFun我从.The value 'myFun' is not accessible from this code location.privatemyFun

奇怪的是,myFun即使没有InternalsVisibleTo.

当实体编译到并且我在主程序集中指定时,为什么myFun无法从测试程序集中访问私有?privateinternalInternalsVisibleTo

4

1 回答 1

2

我认为语言级别和编译代码级别之间存在差异。

  • 在语言级别,private表现为私有,因此您只能调用模块内的函数。如果您将绑定标记为internal,它将表现为内部的,您将能够从同一个程序集中调用它。

  • 在编译代码级别,privates 编译为internal,大概是为了您可以使用诸如闭包和序列表达式之类的东西,但 F# 编译器知道这只是一个编译工件。

我没有尝试过,但我猜如果你从 C# 引用程序集,那么它的行为会像internal因为 C# 编译器不理解 F# 编译器放入标记 let 绑定的特殊元数据。

于 2017-10-05T09:51:57.907 回答