当前位置:  开发笔记 > 编程语言 > 正文

F#中严格的通用枚举转换

如何解决《F#中严格的通用枚举转换》经验,为你挑选了1个好方法。

我想编写一个带签名的函数,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>.

我究竟做错了什么?我怎么能写这个功能?



1> Gus..:

你只需要在"帽子"标志之间的空间ˆ<这样的:

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'时,唯一的地方就是手动编写静态约束.

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有