在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!"
这意味着什么?
答案 0 :(得分:8)
如果您尝试使用Enum.TryParse
解析受区分的联合值,则编译器会给您一个相当无用(如果技术上正确)的消息。
更确切地说,如果你看一下这个函数,你会发现它的参数化类型被约束为一个带有默认构造函数的值类型。 DU不符合这个标准 - 这就是编译器所抱怨的。
在F#中定义枚举时,与C#不同,您需要明确地为每个标签赋值:
type MyEnum =
| Default = 0
| Custom = 1
| Fancy = 2
跳过这些值会使编译器将该类型解释为一个有区别的联合,这是一个非常不同的野兽。