Конвертировать Enum в базовый тип - PullRequest
8 голосов
/ 31 января 2012

У меня есть перечисление следующим образом

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

Как получить базовое значение char, если задано значение enum? например, у меня есть Suit.Clubs и я хочу получить 'C'

Ответы [ 2 ]

16 голосов
/ 31 января 2012

как еще один вариант

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
7 голосов
/ 31 января 2012

Вы можете использовать функции из модуля 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 вы не можете сделать эту ошибку, потому что она всегда возвращает значение правильного базового типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...