如果 F# 中的私有实体编译为内部,为什么 InternalsVisibleTo 不起作用?

If private entities in F# compile to internal, why doesn't InternalsVisibleTo work?

来自 the F# 4.0 spec [PDF]:

The CLI compiled form of all non-public entities is 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. 如果我从 [= 的定义中删除 private 一切正常13=].

奇怪的是,即使没有 InternalsVisibleTo.

,我也可以从 C# 项目中调用私有 myFun

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

我觉得语言级别和编译代码级别是有区别的

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

  • 在编译代码级别,private 被编译为 internal,大概这样您就可以使用闭包和序列表达式之类的东西,但 F# 编译器知道这是编译神器而已

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