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
跳过这些值会使编译器将类型解释为有区别的联合,这是一个非常不同的野兽。
在 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
跳过这些值会使编译器将类型解释为有区别的联合,这是一个非常不同的野兽。