gpt4 book ai didi

exception - F# Guid.Parse TypeInitializationException

转载 作者:行者123 更新时间:2023-12-02 01:07:51 24 4
gpt4 key购买 nike

我正在开发一个用 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# 代码编译为可执行文件。

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

关于exception - F# Guid.Parse TypeInitializationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46731396/

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