F#如何将uint16整数转换为带有Flags特性的枚举类型
F# 中将数值转换为Flags枚举的解决方案
正确转换方式
你可以通过以下两种常用方式完成uint16到StatusWord枚举的转换:
- 使用F#内置的
enum泛型函数(最简便)
let value: uint16 = 0b1000001001us let flags = enum<StatusWord> value
- 使用
LanguagePrimitives.EnumOfValue(适合通用转换场景)
let flags = LanguagePrimitives.EnumOfValue<uint16, StatusWord> value
原写法失败的原因
- 直接调用
StatusWord value的构造语法仅适用于F#可区分联合类型,枚举类型不支持该写法 :>为上行转换操作符,用于子类向父类转换;:?>为下行转换操作符,用于父类向子类转换。数值类型与枚举类型之间不存在继承关系,因此这两个操作符都无法完成转换
验证Flags特性生效
转换完成后可以正常使用枚举的Flags相关操作:
// 检查指定标志位是否存在 flags.HasFlag StatusWord.DATAPROCESS // 返回 true flags.HasFlag StatusWord.PACKETSIZEERROR // 返回 true flags.HasFlag StatusWord.DONOTRETRY // 返回 true // 支持常规按位运算 let noRetryFlag = flags &&& StatusWord.DONOTRETRY
内容的提问来源于stack exchange,提问作者Maurdekye
相关产品推荐
相关产品推荐

