2012-01-30 17 views
6

में Enum कन्वर्ट मैं एक enum के रूप में इस प्रकार हैअंतर्निहित प्रकार

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

मैं अंतर्निहित चार मूल्य अगर enum मान दिया कैसे मिलता है है? जैसे मैं Suit.Clubs है और 'सी'

+0

'ch = (बॉक्स सूट) करते हैं: विभिन्न दृष्टिकोणों का तुलना:

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 

और हुड के नीचे:? > char' काम करने लगता है, लेकिन मुझे उम्मीद है कि एक और अधिक सुरुचिपूर्ण समाधान है जिसमें मुक्केबाजी शामिल नहीं है ... – ildjarn

उत्तर

11

एक और विकल्प

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

let c = Suit.Clubs 
let v : char = LanguagePrimitives.EnumToValue c 

के रूप में संपादित:

.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

+0

मेरा जवाब संपादित – desco

+0

उत्कृष्ट, बहुत व्यापक। +1 – ildjarn

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

मैं था आश्चर्यचकित हुआ जब 'च चो = चार सूट' काम नहीं किया; मैंने माना था कि अंतर्निहित प्रकार के लिए एक स्पष्ट रूपांतरण ऑपरेटर enums के लिए उत्पन्न किया गया था। – ildjarn

संबंधित मुद्दे