我试图定义一个字符串的通用转换操作符来枚举,我想用这样的:F#类型约束
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")
或本:
如果我从类型约束省略'a : enum<'b>
干脆,我可以拥有它,因为我想,但后来如果有人不指定类型,则默认为int
,我真的不喜欢,我'd喜欢它给编译时错误,就像我指定约束时一样错误
也许有任何技巧只指定一个类型参数,并让另一个类型参数被传递?有任何想法吗?
圣牛。我甚至不知道这是有效的语法。我想如果你把它改成“a:enum”,那会给他他想要的东西。他也可以使用'let e:System.Reflection.BindingFlags option = asEnum“DeclaredOnly”'来避免警告。 –
Daniel
2013-02-27 15:55:33
为什么这个工作,但在'<' '>'之间放置相同的约束不? – Daniel 2013-02-27 15:57:46
@丹尼尔 - 我不认为@ovastus希望'int'被迫,他希望在可能的情况下推断它(它是)。 – kvb 2013-02-27 16:13:21