F#Guid.Parse TypeInitializationException

F#Guid.Parse TypeInitializationException,exception,f#,Exception,F#,我正在做一个用F#写的WebApi项目。这里有一个片段: module MyModule open System let MyGuid = Guid.Parse "934F0B12-D00A-491D-862D-EE745EF3C560" let myFunction list = list.Get(MyGuid) // --> here MyGuid has the TypeInitializationException before list.Get is called

我正在做一个用F#写的WebApi项目。这里有一个片段:

module MyModule

open System

let MyGuid = Guid.Parse "934F0B12-D00A-491D-862D-EE745EF3C560"

let myFunction list = 
    list.Get(MyGuid) // --> here MyGuid has the TypeInitializationException before list.Get is called 
通过调试,我可以看到MyGuid实际上有一个错误

更改以下代码后,它会起作用:

module MyModule

open System

let MyGuid () = Guid.Parse "934F0B12-D00A-491D-862D-EE745EF3C560"

let myFunction list = 
    list.Get(MyGuid())

我知道第一个示例的MyGuid是变量,第二个示例是函数定义,但为什么第一个示例会出现异常?我的代码MyGuid有时会被使用。因此,在第一个示例中,我只有一个实例,在第二个示例中,每次调用MyGuid时都会有一个新实例…

我不能100%确定这就是问题所在,但我有时在使用单元测试运行程序时也看到类似的行为。我猜发生错误的原因是顶级
MyGuid
变量没有正确初始化,并且具有默认的零值(因此,查找失败)

在F#中初始化全局变量的方式很复杂-如果您将代码编译为可执行文件,则可以通过
Main
方法实现。但是,如果您将代码编译为库,编译器将向库中类型的静态构造函数中插入初始化检查(以确保在访问任何内容之前初始化所有内容)

我认为,如果您将代码编译为可执行文件,然后将其作为库加载,则可能会出现这种情况—入口点未被调用,因此变量未初始化。我不确定WebApi到底是如何加载库的,但这可能是个问题——特别是如果您将F#代码编译为可执行文件


将全局变量转换为函数的方法解决了这一问题,因为函数是作为方法编译的,因此可以避免引用未初始化的值。遗憾的是,我认为没有更好的解决方法。

什么是
列表的类型以及什么是
列表。获取
?什么是
类型初始化异常
?它的
InnerException
?什么
list
list.Get
都不重要,此时
MyGuid
已经出现了
故障。无法查看Innerexceptions,只有“MyGuid”引发了“System.TypeInitializationException”类型的异常。如前所述,问题不在于调用
list.Get进行查找。通过在此行设置断点,Guid中包含此TypeInitializationException,而不是Guid实例。我正在做一个web项目
WebApi
,在这一点上,我认为这是一种bug。@Emaborsa我看到这被标记为答案-这背后的问题是什么?我的猜测很接近,还是其他原因?我不知道问题出在哪里。我将静态变量转换为函数。如果它是一个更大的项目,我会创建一种单例模块/类,以避免相同guid的多个实例。