Mau*_*kye 1 enums flags f# casting type-conversion
我有一个带有 flags 属性的枚举类型:
[<Flags>]
type StatusWord =
| DATAPROCESS = 0b0000000001
| ERRORPRESENT = 0b0000000010
| CHECKSUMERROR = 0b0000000100
| PACKETSIZEERROR = 0b0000001000
| TIMEOUT = 0b0000010000
| DONOTRETRY = 0b1000000000
Run Code Online (Sandbox Code Playgroud)
在一些数据初始化期间,我有一个uint16想要转换为枚举类型的值StatusWord,因此我可以比较它的属性:
let value: uint16 = 0b1000001001us
let flags: StatusWord = StatusWord value
Run Code Online (Sandbox Code Playgroud)
但是,正如您可能猜到的那样,这段代码无法编译;转换不可用。同样,我也无法进行显式强制转换,例如。value :> StatusWord或者value :?> StatusWord。这是 C# 中的一个简单任务,因此我无法弄清楚为什么不能在 F# 中完成它。
所以,有两件事你必须担心。其中之一(我认为您已经意识到)是您的基础枚举类型是 int32,而您的值是 uint16,因此需要在某个地方进行转换。第二,你必须构造枚举类型。
StatusWord 看起来像一个构造函数(类似于 union case 成员),但事实并非如此。因此,这里有两种方法可以使用您的 uint16 值来执行此操作,而第三种方法可以更好地提高可读性(如果您可以这样做的话)。
let value = 0b1000001001us
// use F# enum operator
let flags1 = enum<StatusWord> (int value)
// use static Enum class
let flags2 = Enum.Parse(typeof<StatusWord>, string value) :?> StatusWord
// do bitwise stuff, of course now the compiler knows what you're doing
let flags3 = StatusWord.DATAPROCESS ||| StatusWord.PACKETSIZEERROR ||| StatusWord.DONOTRETRY
Run Code Online (Sandbox Code Playgroud)
因为有多种方法,我不得不刷新我的记忆,我在
https://fsharpforfunandprofit.com/posts/enum-types/
强烈推荐阅读该文章(该文章和该博客的其余部分 - 这是很多人学习 F# 的原因)。
| 归档时间: |
|
| 查看次数: |
444 次 |
| 最近记录: |