我想编写一个带签名的函数,int -> 'TEnum
如果目标枚举不包含输入值,它将抛出异常.这是我的第一次尝试:
let parseEnum<'TEnum when 'TEnum : enum> (value : int) : 'TEnum = let enumType = typeof<'TEnum> if not <| Enum.IsDefined (enumType, value) then raise <| ArgumentException (sprintf "Invalid value of %A: %d" enumType value) enum value
编译器向我显示以下错误消息:"错误FS0001:此处不能使用声明的类型参数'TEnum',因为在编译时无法解析类型参数"(我认为这是因为enum
具有附加约束的函数).
那么,好吧,我理解这个问题.我将使用静态解析的类型参数.这是我的第二次尝试:
let inline parseEnum2 (value : int) : ^TEnum = let enumType = typeof<^TEnum> if not <| Enum.IsDefined (enumType, value) then raise <| ArgumentException (sprintf "Invalid value of %A: %d" enumType value) enum value
但是编译器仍然抱怨:"错误FS3156:行中出现了意外的令牌'>'或不完整的表达式" typeof<^TEnum>
.
我究竟做错了什么?我怎么能写这个功能?
你只需要在"帽子"标志之间的空间ˆ
和<
这样的:
let enumType = typeof< ^TEnum>
事实上你不需要帽子,你可以写:
open System let inline parseEnum2 value : 'TEnum = let enumType = typeof<'TEnum> if not <| Enum.IsDefined (enumType, value) then raise <| ArgumentException (sprintf "Invalid value of %A: %d" enumType value) enum value
因为在这种情况下会自动推断静态约束,所以当你真正必须编写'hat'时,唯一的地方就是手动编写静态约束.