我使用 DU 类型作为标签,即没有尾随数据,但在运行时,它会引发异常。
喜欢
[<Struct>]
type Tag =
| Case0
:
| CaseN
当 N 变得足够大时,运行时会抛出异常。
“System.InvalidProgramException:公共语言运行时检测到 无效程序”
如果我删除
[<Struct>]
,它就会消失,但它的目的是消除尊重并最小化字节大小,指针是 8 字节,而作为结构体,它是 4 字节。
我知道我可以使用枚举来代替,但这会导致不希望的显式键入
Tag.Case0
而不是
Case0
并且需要为每种情况明确分配一个数字,这充其量也是很麻烦的。
我知道这是一个普遍问题,但它与代码中的使用无关。
谁能告诉我为什么 dotnet 选择只允许具有显式值的枚举声明?我知道我们需要它的情况,但在许多情况下,只要每个枚举情况分配了唯一的值,枚举情况具有哪个值并不重要。
这是编译器中的一个已知错误https://github.com/dotnet/fsharp/issues/5342看起来最近已修复。我推测当 .NET 8 很快发布时,修复程序将会可用。