我有一个枚举如下转换成枚举基础类型
type Suit =
|Clubs = 'C'
|Spades = 'S'
|Hearts = 'H'
|Diamonds = 'D'
如何获取如果给枚举值的根本char值? 例如,我有Suit.Clubs
,并希望得到“C”
我有一个枚举如下转换成枚举基础类型
type Suit =
|Clubs = 'C'
|Spades = 'S'
|Hearts = 'H'
|Diamonds = 'D'
如何获取如果给枚举值的根本char值? 例如,我有Suit.Clubs
,并希望得到“C”
作为另一种选择
type Suit =
|Clubs = 'C'
|Spades = 'S'
|Hearts = 'H'
|Diamonds = 'D'
let c = Suit.Clubs
let v : char = LanguagePrimitives.EnumToValue c
编辑: 比较不同的方法:
type Suit =
|Clubs = 'C'
|Spades = 'S'
|Hearts = 'H'
|Diamonds = 'D'
let valueOf1 (e : Suit) = LanguagePrimitives.EnumToValue e
let valueOf2 (e : Suit) = unbox<char> e
let valueOf3 (e : Suit) = (box e) :?> char
而且引擎盖下:
.method public static
char valueOf1 (
valuetype Program/Suit e
) cil managed
{
// Method begins at RVA 0x2050
// Code size 3 (0x3)
.maxstack 8
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ret
} // end of method Program::valueOf1
.method public static
char valueOf2 (
valuetype Program/Suit e
) cil managed
{
// Method begins at RVA 0x2054
// Code size 13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldarg.0
IL_0002: box Program/Suit
IL_0007: unbox.any [mscorlib]System.Char
IL_000c: ret
} // end of method Program::valueOf2
.method public static
char valueOf3 (
valuetype Program/Suit e
) cil managed
{
// Method begins at RVA 0x2064
// Code size 13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldarg.0
IL_0002: box Program/Suit
IL_0007: unbox.any [mscorlib]System.Char
IL_000c: ret
} // end of method Program::valueOf3
您可以使用函数从LanguagePrimitives
模块:
// Convert enum value to the underlying char value
let ch = LanguagePrimitives.EnumToValue Suit.Clubs
// Convert the char value back to enum
let suit = LanguagePrimitives.EnumOfValue ch
编辑:我没有看到我的第一个答案尝试这些功能,所以我第一次使用建议:
unbox<char> Suit.Clubs
这比什么ildjarn的意见建议短,但它有同样的问题 - 没有检查你是否正在转换到正确的类型。使用EnumToValue
,您不能犯这个错误,因为它总是返回正确的基础类型的值。
我是当“让ch = char suit”不起作用时感到惊讶;我曾经假定为枚举生成了一个显式的底层类型转换运算符。 – ildjarn 2012-01-31 00:14:35
'让CH =(盒套装): > char'似乎工作,但我希望有一个更优雅的解决方案,不涉及拳击... – ildjarn 2012-01-30 23:57:48