如何使用基础值定义枚举常量

Dan*_*iel 7 enums f# constants

这个C#的F#等价物是什么:

const MyEnum None = (MyEnum)1;
Run Code Online (Sandbox Code Playgroud)

这不起作用:

[<Literal>]
let None : MyEnum = enum 1 //ERROR: not a valid constant expression
Run Code Online (Sandbox Code Playgroud)

虽然,奇怪的是,在属性构造函数中它是可以的:

[<MyAttribute(enum 1)>]
type T = class end
Run Code Online (Sandbox Code Playgroud)

这种差异似乎很奇怪.

UPDATE

这在v3.1中得到修复,并按预期工作.

byt*_*ter 1

造成这种差异的原因是,C#确实(MyEnum)0 一个文字,但 F#enum是一个类型为 的函数int32 -> 'T
我相信 F# 团队为这个构造添加特殊处理并不困难,但遗憾的是目前还没有。

尽管如此,有一种方法可以实现您所需要的,但只是为了0价值:

type MyEnum =
    | None = 0
    | Foo = 1

[<Literal>]
let X = MyEnum()
Run Code Online (Sandbox Code Playgroud)