F# 等价于 Enum.TryParse

F# Equivalent of Enum.TryParse

在 C# 中,以下代码有效:

MyEnum myEnum = MyEnum.DEFAULT;
if (Enum.TryParse<MyEnum>(string, out myEnum))
{
    Console.WriteLine("Success!");
}

所以我想我会在 F# 中使用它。这是我的尝试:

let mutable myEnum = MyEnum.DEFAULT
if Enum.TryParse<MyEnum>(string, &myEnum) then
    printfn "Success!"

但它抱怨

a generic construct requires that the type 'MyEnum' have a default constructor

这到底是什么意思?

如果您尝试使用 Enum.TryParse 解析可区分的联合值,编译器会向您提供一条毫无帮助(如果技术上正确的话)的消息。

更准确地说,如果您查看该函数,您会发现它的参数化类型被限制为具有默认构造函数的值类型。 DU 不满足这两个条件——这就是编译器所抱怨的。

在 F# 中定义枚举时,与 C# 不同,您需要明确地为每个标签赋予一个值:

type MyEnum = 
    | Default = 0
    | Custom = 1
    | Fancy = 2

跳过这些值会使编译器将类型解释为有区别的联合,这是一个非常不同的野兽。