2012-01-30 112 views
6

我有一个枚举如下转换成枚举基础类型

type Suit = 
    |Clubs = 'C' 
    |Spades = 'S' 
    |Hearts = 'H' 
    |Diamonds = 'D' 

如何获取如果给枚举值的根本char值? 例如,我有Suit.Clubs,并希望得到“C”

+0

'让CH =(盒套装): > char'似乎工作,但我希望有一个更优雅的解决方案,不涉及拳击... – ildjarn 2012-01-30 23:57:48

回答

11

作为另一种选择

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 
+0

使用'LanguagePrimitives.EnumToValue'有什么缺点吗?例如。它是否在内部使用反射? – ildjarn 2012-01-31 00:16:36

+0

编辑我的回答 – desco 2012-01-31 00:33:26

+0

优秀,非常全面。 +1 – ildjarn 2012-01-31 00:38:31

4

您可以使用函数从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,您不能犯这个错误,因为它总是返回正确的基础类型的值。

+2

我是当“让ch = char suit”不起作用时感到惊讶;我曾经假定为枚举生成了一个显式的底层类型转换运算符。 – ildjarn 2012-01-31 00:14:35