作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想写一个带有签名 int -> 'TEnum
的函数如果目标枚举不包含输入值,则会抛出异常。这是我的第一次尝试:
let parseEnum<'TEnum when 'TEnum : enum<int>> (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
函数有一个额外的约束)。
好吧,好吧,我明白这个问题了。我将使用statically resolved type parameter 。这是我的第二次尝试:
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
因为在这种情况下静态约束是自动推断的,所以真正需要编写“帽子”的唯一地方是手动编写静态约束。
关于generics - F# 中的严格泛型枚举转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34102084/
我是一名优秀的程序员,十分优秀!