如何在 F# 中为枚举指定基础类型

how to specify an underlying type for enum in F#

我们可以像这样在 C# 中为枚举指定底层类型:

[Flags]
public enum MyKinds : ushort
{
    None  = 0,
    Flag1 = 1 << 0,
    Flag2 = 1 << 1,
    // ...
}
  1. 我如何使用 F# 做到这一点?
type MyKinds = 
    | None  = 0 
    | Flag1 = 1
    | Flag2 = 2

    // inherit ushort  // error FS0912
  1. 如何在 F# 中使用像 1 << 0 这样的按位运算符来定义枚举值?
type MyKinds = 
    | None = 0 
    | Flag1 = 1 << 0    // error FS0010
    | Flag2 = 1 << 1    // error FS0010

The Docs 中所述,F# 中枚举的基础类型由数字后缀确定。
所以在你的情况下,对于 ushort (unit16),它将是:

type MyKinds = 
    | None  = 0us 
    | Flag1 = 1us
    | Flag2 = 2us

(可用的不同号码类型的后缀 Here

不能使用位移,但这不是更好吗?

type MyKinds = 
    | None =  0b0000us
    | Flag1 = 0b0001us
    | Flag2 = 0b0010us

此外,如果这些要用作位标志,您可能需要添加 [<Flag>] 属性,以便打印值时将显示标志的任意组合。