问:是否有像Java这样的.NET构造Note.C = 1, Note.D = 2,?
如果我在F#中有以下枚举:
type Note =
| C = 0
| D = 2
| E = 4
| F = 5
| G = 7
| A = 9
| B = 11
Run Code Online (Sandbox Code Playgroud)
但是在某些方面,我需要其中的项目的序数,这样foo.ordinal()等等.显然在其他语言中,Note.C = 1, Note.D = 2,可以工作,但在这里有必要使用这样的函数:
let getNoteOrdinal = function
|Note.C -> 1
|Note.D -> 2
|Note.E -> 3
|Note.F -> 4
//etc
Run Code Online (Sandbox Code Playgroud)
这个功能是必要的还是有更好的东西?
.NET 中的枚举只是整数类型之上的一层,在本例中,您的值是int.
根据文档,您可以进行简单的转换来获取该值,例如:
let value = int Note.B
Run Code Online (Sandbox Code Playgroud)
value在这种情况下会在哪里11。
要查找序数,您可以使用内置函数,该函数会按顺序提供所有值的数组,然后找到您要查找的值的索引。例如:
let getNoteOrdinal (note: Note) =
let values = Enum.GetValues(typeof<Note>)
Array.IndexOf(values, note) + 1
let value = getNoteOrdinal Note.E
Run Code Online (Sandbox Code Playgroud)
value在这种情况下会在哪里3。
您可以按照 @ReedCopsey 的建议更进一步,创建一个通用函数,为您提供任何枚举值的序数:
let getEnumOrdinal (e: 'a when 'a : enum<'b> and 'a : equality) =
let values = Enum.GetValues(e.GetType())
Array.IndexOf(values, e) + 1
Run Code Online (Sandbox Code Playgroud)