在F#中获取枚举类型的第一个值

时间:2014-04-16 05:13:32

标签: f#

我有一个带枚举属性的类。要使用紧凑属性语法,我必须使用类型中的值对其进行初始化,例如

type Color = 
    | Blue= 0
    | Green= 1

type MyClass() =
    member val Col = Color.Blue with get, set // <-- the problem

但是,我不喜欢那里的硬编码Blue,并且更愿意将其设置为枚举的第一项。

我已经能够做到这一点:

member val Color = enum<Color>(unbox (Enum.GetValues(typeof<Color>).GetValue(0))) ...

毋庸置疑,我希望有更好的方法来获取枚举的第一个值,或者初始化属性!

3 个答案:

答案 0 :(得分:3)

如果第一个成员在你的程序中很重要,那么明确它是有意义的。拥有两个具有相同价值的成员是完全没问题的。

type Color    = 
    | Default = 0
    | Blue    = 0
    | Green   = 1

type MyClass() =
    member val Col = Color.Default with get, set

由于枚举相等性取决于基础值,因此可以根据需要工作(即打印"blue"):

let c = MyClass()
match c.Col with
| Color.Blue -> printfn "blue"
| _ -> printfn "not blue"

答案 1 :(得分:2)

鉴于您提到的两种替代方案,我相信您最好使用Color.Blue。虽然支持枚举的数值完全是任意的,但颜色至少在您的应用程序中有一些含义。如果您对直接设置值感到不舒服,因为有与默认值相关的额外含义,您可以随时在其他地方单独定义:

let standardUniformColor = Color.Blue
//(...)
type MyClass() = member val Col = standardUniformColor with get, set

答案 2 :(得分:1)

您可以使用魔术enum功能:

type Color =
    | Blue= 0
    | Green= 1

type MyClass() =
    member val Col : Color = enum 0 with get, set 

唯一的问题是你需要在某处使用类型注释,以便编译器知道要转换为哪个枚举。

注意:这假定枚举的第一个值为0.