gpt4 book ai didi

f# - F# 中的模块值不会被初始化。为什么?

转载 作者:行者123 更新时间:2023-12-03 23:28:57 24 4
gpt4 key购买 nike

当我使用 F# 时,我得到了一个奇怪的行为。
当我在模块中使用 let 绑定(bind)时,如果值是从构造函数创建的,那么在外部使用时它是未初始化的。 (我在 C# 中使用 ModuleName.s2 或 ModuleName.f() 使用它)

//in a module
let s1 = "1" //normal
let s2 = new String('i', 5) //null

let f () =
s2.Equals("something") //Exception

这是正常行为吗?提前致谢。

编辑:
出于调试的目的,我选择将其编译为可执行文件。正如其他人指出的那样,这可能是问题所在。

最佳答案

在 F# 库中,模块通过静态构造函数进行初始化,这些构造函数确保在使用任何模块的值之前进行初始化。相比之下,在 F# 可执行文件中,此初始化是在应用程序的入口点执行的。这意味着如果另一个程序集引用了 F# 应用程序(无论其他应用程序是用什么语言编写的),初始化代码都不会运行。

更新

布赖恩指给我this part of the spec ,这表明这是预期的行为。

看起来一种解决方法是提供一个明确的入口点,如下所示:

[<EntryPoint>]
let main _ =
0

然后,您可以从 C# 应用程序调用此 main 方法,以确保正确初始化模块的内容。

更新 2

我误读了规范-您实际上不需要从引用程序集中调用显式入口点。它的存在将导致初始化正确发生。

关于f# - F# 中的模块值不会被初始化。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6629891/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com