如果 F# 中的私有实体编译为内部,为什么 InternalsVisibleTo 不起作用?
If private entities in F# compile to internal, why doesn't InternalsVisibleTo work?
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 绑定。
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
.
myFun
当 private
实体编译为 internal
并且我在主程序集中指定了 InternalsVisibleTo
时,为什么私有 myFun
无法从测试程序集访问?
我觉得语言级别和编译代码级别是有区别的
在语言级别,
private
表现为私有,因此您只能调用模块内的函数。如果您将绑定标记为internal
,它将表现为内部绑定,您将能够从同一个程序集中调用它。在编译代码级别,
private
被编译为internal
,大概这样您就可以使用闭包和序列表达式之类的东西,但 F# 编译器知道这是编译神器而已
我没有尝试过,但我猜想如果您从 C# 引用程序集,那么它的行为将与 internal
相同,因为 C# 编译器不理解 F# 编译器放入的特殊元数据标记 let 绑定。