sto cercando di definire un operatore di conversione generica da una stringa in un Enum, e mi piacerebbe utilizzarlo in questo modo:F # tipo vincoli sulle enumerazioni
let day = asEnum<DayOfWeek>("Monday")
Ma con questa implementazione:
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
posso usare solo in questo modo:
let day = asEnum<DayOfWeek,_>("Monday")
o questo:
let day:DayOfWeek option = asEnum("Monday")
Se Tralascio il 'a : enum<'b>
del tutto dal vincolo di tipo, posso avere come voglio, ma poi se qualcuno non specifica il tipo di questo verrà impostato a int
, che davvero non mi piace, mi preferisco dare un errore di compilazione come fa quando specificano un vincolo
Forse c'è qualche trucco per specificare solo un parametro di tipo e l'altro ha dedotto? Qualche idea?
Porca vacca. Non sapevo nemmeno che fosse una sintassi valida. Penso che se lo cambi in ''a: enum' questo gli darà quello che vuole. Potrebbe anche fare 'let e: System.Reflection.BindingFlags option = asEnum" DeclaredOnly "' per evitare l'avviso. –
Daniel
Perché funziona, eppure non applica lo stesso vincolo tra "<' '>"? – Daniel
@Daniel - Non penso che @ovastus voglia che 'int' sia forzato, vuole che sia dedotto se possibile (che è). – kvb