2017-01-05 13 views
6

W języku C#, następujący kod jest ważny:F # Odpowiednik Enum.TryParse

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

Więc pomyślałem, że to wykorzystać w F #. Oto moja próba:

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

Ale narzeka

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

Co w świecie to znaczy?

+1

Nie mogę odtworzyć tego, jeśli zmienię "MójEnum" na "System.DayOfWeek". Jaka jest definicja "MyEnum"? FYI możesz usunąć potrzebę 'mutable', wykonując' let (ok, myEnum) = Enum.TryParse (ciąg) 'zamiast tego. – Lee

+5

Jak zdefiniowana jest Twoja wyliczanka? Sądzę, że możesz próbować sparsować dyskryminowaną unię zamiast wyliczać. – scrwtp

+0

@scrwtp, masz całkowitą rację. Nie zdawałem sobie sprawy, że istnieje niewielka różnica w sposobie definiowania w F #. Aby zrozumieć, musiałem przyjrzeć się https://fsharpforfunandprofit.com/posts/enum-types/. Jeśli uczynisz tę odpowiedź, ustawię ją jako "odpowiedź". – user3685285

Odpowiedz

7

Jest to niepomocny (o ile technicznie poprawny) komunikat, który kompilator podaje, jeśli próbujesz przeanalizować dyskryminowaną wartość unii przy użyciu Enum.TryParse.

Dokładniej, jeśli spojrzysz na tę funkcję, zobaczysz, że jest sparametryzowana za pomocą typu, który jest ograniczony do typu wartości z domyślnym konstruktorem. DU nie spełniają żadnego z tych kryteriów - na to kompiluje się kompilator.

Podczas definiowania enum w F #, w przeciwieństwie do C#, trzeba wyraźnie dać każdej etykiety wartość:

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

Pomijanie wartości sprawi, że kompilator interpretują typ jako dyskryminowanej unii, która jest bardzo inna bestia.