我正在尝试定义从字符串到枚举的通用转换运算符,我想像这样使用它:
let day = asEnum<DayOfWeek>("Monday")
但是有了这个实现:
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
我只能这样使用它:
let day = asEnum<DayOfWeek,_>("Monday")
或这个:
let day:DayOfWeek option = asEnum("Monday")
如果我从类型约束中完全省略了'a : enum<'b>
,我可以随意使用它,但是如果有人没有指定类型,它将默认为int
,我真的不喜欢,我希望它给出一个编译时间错误,就像我指定约束时一样
也许只指定一个类型参数并推断另一个类型参数有什么技巧?有任何想法吗?