在C#中,以下代码有效:
MyEnum myEnum = MyEnum.DEFAULT;
if (Enum.TryParse<MyEnum>(string, out myEnum))
{
Console.WriteLine("Success!");
}
Run Code Online (Sandbox Code Playgroud)
所以我想我会在F#中使用它.这是我的尝试:
let mutable myEnum = MyEnum.DEFAULT
if Enum.TryParse<MyEnum>(string, &myEnum) then
printfn "Success!"
Run Code Online (Sandbox Code Playgroud)
但它抱怨道
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
Run Code Online (Sandbox Code Playgroud)
跳过这些值会使编译器将该类型解释为一个有区别的联合,这是一个非常不同的野兽.