Ich versuche, einen allgemeinen Umwandlungsoperator aus einer Zeichenfolge zu einem Enum zu definieren, und ich mag es so verwenden:F # Typ Einschränkungen für Aufzählungen
let day = asEnum<DayOfWeek>("Monday")
Aber mit dieser Umsetzung:
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
ich kann es nur wie folgt verwenden:
let day = asEnum<DayOfWeek,_>("Monday")
oder dies:
let day:DayOfWeek option = asEnum("Monday")
Wenn ich die 'a : enum<'b>
ganz aus der Art Zwang weglassen, ich kann es haben, wie ich will, aber dann, wenn jemand nicht den Typ spezifiziert wird es int
Standard, was ich nicht mag, ich würde es vorziehen, einen Kompilierzeitfehler zu geben, wie es tut, wenn ich eine Beschränkung spezifiziere
Vielleicht gibt es irgendeinen Trick, um nur einen Typparameter zu spezifizieren und hat das andere eingegebene? Irgendwelche Ideen?
Heilige Kuh. Ich wusste nicht einmal, dass das eine gültige Syntax war. Ich denke, wenn Sie es in 'a ändern: enum' das wird ihm geben, was er will. Er könnte auch 'let e: System.Reflection.BindingFlags option = asEnum" DeclaredOnly "' machen, um die Warnung zu vermeiden. –
Daniel
Warum funktioniert das, obwohl die gleiche Bedingung zwischen "<' '>" nicht gestellt wird? – Daniel
@Daniel - Ich glaube nicht, dass @ovastus will, dass "int" gezwungen wird, er möchte, dass es gefolgert wird, wenn möglich (was es ist). – kvb