为什么在大量情况下使用 struct 修饰 DU 时,F# 运行时会抛出无效程序错误

问题描述 投票:0回答:1

我使用 DU 类型作为标签,即没有尾随数据,但在运行时,它会引发异常。

喜欢

[<Struct>]
type Tag =
    | Case0
        :
    | CaseN

当 N 变得足够大时,运行时会抛出异常。

“System.InvalidProgramException:公共语言运行时检测到 无效程序”

如果我删除

[<Struct>]
,它就会消失,但它的目的是消除尊重并最小化字节大小,指针是 8 字节,而作为结构体,它是 4 字节。

我知道我可以使用枚举来代替,但这会导致不希望的显式键入

Tag.Case0
而不是
Case0
并且需要为每种情况明确分配一个数字,这充其量也是很麻烦的。

我知道这是一个普遍问题,但它与代码中的使用无关。

谁能告诉我为什么 dotnet 选择只允许具有显式值的枚举声明?我知道我们需要它的情况,但在许多情况下,只要每个枚举情况分配了唯一的值,枚举情况具有哪个值并不重要。

f# compiler-construction runtime
1个回答
0
投票

这是编译器中的一个已知错误https://github.com/dotnet/fsharp/issues/5342看起来最近已修复。我推测当 .NET 8 很快发布时,修复程序将会可用。

© www.soinside.com 2019 - 2024. All rights reserved.