Próbuję określić ogólny operatora konwersji z ciągu znaków do wyliczenia i chciałbym używać go tak:F # typu ograniczeń na teksty stałe
let day = asEnum<DayOfWeek>("Monday")
Ale z tej realizacji:
let asEnum<'a, 'b when 'a: (new : unit -> 'a) and 'a : struct and 'a :> ValueType and 'a : enum<'b>> text =
match Enum.TryParse<'a>(text) with
| true, value -> Some value
| false, _ -> None
mogę użyć tylko to tak:
let day = asEnum<DayOfWeek,_>("Monday")
lub to:
let day:DayOfWeek option = asEnum("Monday")
Jeśli pominąć 'a : enum<'b>
całkowicie od rodzaju przymusu, mogę mieć to jak chcę, ale jeśli ktoś nie określił to domyślnie int
, co bardzo mi się nie podoba, ja wolałby dać błąd czasu kompilacji, tak jak wtedy, gdy określę ograniczenie. Może jest jakaś sztuczka, żeby podać tylko jeden parametr i mieć drugi? Jakieś pomysły?
Holy cow. Nawet nie wiedziałem, że to była poprawna składnia. Myślę, że jeśli zmienisz go na '' a: enum ', który da mu to, czego chce. Mógł także zrobić opcję let: System.Reflection.BindingFlags = asEnum "DeclaredOnly" ', aby uniknąć ostrzeżenia. –
Daniel
Dlaczego to działa, ale wprowadzanie tego samego ograniczenia między '<' '>' nie powoduje? – Daniel
@Daniel - Nie sądzę, że @ovastus chce, aby 'int' był wymuszony, chce, żeby to było wywnioskowane, jeśli to możliwe (co to jest). – kvb