将枚举转换为基础类型

Jas*_*inn 10 f#

我有一个枚举如下

type Suit =
    |Clubs = 'C'
    |Spades = 'S'
    |Hearts = 'H'
    |Diamonds = 'D'
Run Code Online (Sandbox Code Playgroud)

如果给定枚举值,如何获取基础char值?例如,我有Suit.Clubs并想要'C'

des*_*sco 18

作为另一种选择

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

let c = Suit.Clubs
let v : char = LanguagePrimitives.EnumToValue c
Run Code Online (Sandbox Code Playgroud)

编辑:不同方法的比较:

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
Run Code Online (Sandbox Code Playgroud)

并在引擎盖下:

.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
Run Code Online (Sandbox Code Playgroud)


Tom*_*cek 7

您可以使用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
Run Code Online (Sandbox Code Playgroud)

编辑:我在第一次回答尝试中没有看到这些功能,所以我首先建议使用:

unbox<char> Suit.Clubs
Run Code Online (Sandbox Code Playgroud)

这比ildjarn在评论中建议的要短,但它有同样的问题 - 没有检查你实际上转换为正确的类型.有了EnumToValue,你不能犯这个错误,因为它总是返回正确的底层类型的值.

  • 当'让ch = char suit`不起作用时,我感到很惊讶; 我假设为枚举生成了基础类型的显式转换运算符. (2认同)