F#等效于Enum.TryParse

use*_*285 8 enums f# tryparse

在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

这意味着什么?

scr*_*wtp 8

这是一个相当无用的(如果技术上正确的)消息,如果您尝试使用分析的区分联合值,编译器会给您Enum.TryParse.

更准确地说,如果你看一下这个函数,你会发现它的参数化类型被约束为一个带有默认构造函数的值类型.DU不符合这个标准 - 这就是编译器所抱怨的.

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

type MyEnum = 
    | Default = 0
    | Custom = 1
    | Fancy = 2
Run Code Online (Sandbox Code Playgroud)

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