2017-01-05 4 views
6

In C#, der folgende Code gilt:F # Equivalent von Enum.TryParse

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

Also dachte ich, ich würde das Produkt # in F verwenden. Hier ist mein Versuch:

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

Aber es klagt

a generic construct requires that the type 'MyEnum' have a default constructor

Was in der Welt bedeutet das?

+1

Ich kann das nicht reproduzieren, wenn ich 'MyEnum' für' System.DayOfWeek' ändere. Was ist die Definition von "MyEnum"? FYI Sie können die Notwendigkeit für "veränderbar" entfernen, indem Sie stattdessen "let (ok, myEnum) = Enum.TryParse (string)" verwenden. – Lee

+5

Wie ist Ihr Enum definiert? Ich denke, dass Sie versuchen könnten, eine diskriminierte Union stattdessen als Enum zu analysieren. – scrwtp

+0

@scrwtp, Sie sind völlig richtig. Ich wusste nicht, dass es einen kleinen Unterschied in der Definition in F # gibt. Musste sich https://fsharpfforfunandprofit.com/posts/enum-types/ ansehen um zu verstehen. Wenn Sie dies zu einer Antwort machen, werde ich es als "die Antwort" festlegen. – user3685285

Antwort

7

Dies ist eine eher nicht hilfreiche (wenn technisch korrekte) Nachricht, die der Compiler Ihnen gibt, wenn Sie versuchen, einen diskriminierten Union-Wert mit Enum.TryParse zu analysieren.

Genauer gesagt, wenn Sie diese Funktion betrachten, werden Sie sehen, dass sie mit einem Typ parametrisiert ist, der als Werttyp mit einem Standardkonstruktor definiert ist. DUs erfüllen keines dieser Kriterien - darüber beschwert sich der Compiler.

Wenn eine ENUM in F # definiert, im Gegensatz zu C#, müssen Sie explizit die jeweils einen Wert beschriften geben:

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

die Werte Skipping würde der Compiler den Typ als diskriminiert Vereinigung interpretieren machen, was ein sehr anderes Tier.