在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都不满足这两个条件-这就是编译器所提示的。
与C#不同,在F#中定义枚举时,需要显式为每个标签赋予一个值:
type MyEnum =
| Default = 0
| Custom = 1
| Fancy = 2
跳过这些值将使编译器将类型解释为有区别的联合,这是非常不同的野兽。
关于enums - F#等效于Enum.TryParse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41489599/