我想编写一个带有泛型枚举值的F#函数,让's say, doubles its underlying integer value. Fortunately, there'是一个名为 int
的内置函数,它将枚举转换为整数,所以这应该很简单,对吧?这是我的第一次尝试:
let doubler (value : 't when 't : enum<int>) =
2 * (int value)
遗憾的是,这导致以下编译器消息:
Program.fs(2,10):警告FS0064:此构造导致代码不如类型注释所指示的那样通用 . 类型变量't已被约束为类型'int' . Program.fs(2,10):错误FS0071:对类型推断变量应用默认类型“int”时,类型约束不匹配 . 类型“int”不是CLI枚举类型 . 另见Program.fs(1,28) - (1,42) . 考虑添加其他类型约束
我究竟做错了什么?有没有更好的方法从F#中的泛型枚举值中提取底层整数?
1 回答
你需要
EnumToValue
.如果你检查
doubler
的类型签名:关于你的第一个错误,
int
是特殊的,从某种意义上说它也是一个功能 . 正如您所指出的,您可以在枚举中使用基础类型约束,但在这种情况下,请明确说明类型,因此不会产生混淆:不幸的是,如果不使用
EnumToValue
,你仍然无法施放到int
. 可能是编译器问题,或其他 . 也许EnumToValue的内部可以给出一个提示?