我有一个带枚举属性的类。要使用紧凑属性语法,我必须使用类型中的值对其进行初始化,例如
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))) ...
毋庸置疑,我希望有更好的方法来获取枚举的第一个值,或者初始化属性!
答案 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.