F#等效于Enum.TryParse

时间:2017-01-05 16:09:41

标签: enums f# tryparse

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

var corX = "100";
var corY = "100";

var x = document.createElement("IMG");
// Take the element out of the normal "flow"
x.style.position = "absolute";

x.setAttribute("id", corX + "," + corX);
x.setAttribute("src", "pin.png");
x.setAttribute("width", "20");
x.setAttribute("height", "20");

x.style.left = corX + "px";
x.style.top = corY + "px";
x.style.transform = "translate(-50%, -50%)";
x.style.zIndex = "-1";
document.body.appendChild(x);

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

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

但它抱怨

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

这意味着什么?

1 个答案:

答案 0 :(得分:8)

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

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

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

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

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