2012-08-16 13 views
15

यह सवाल enums के लिए सामान्य तरीकोंसी # कास्टिंग

public enum Crustaceans 
{ 
    Frog = 1, 
    Toad = 4 
} 

मैं बस पर्याप्त मेरी enum का एक उदाहरण

short val = 4; 
Crustaceans crusty = (Crustaceans) val; 

बना सकते हैं एक enum को देखते हुए भीतर enums की ढलाई से संबंधित है हालांकि, अगर

short val = 4; 
object obj = (object) val; 
Crustaceans crusty = (Crustaceans)obj; 

क्रिस्टी के प्रारंभिकरण को करने का प्रयास करने के लिए एक रनटाइम अपवाद फेंक दिया जाता है।

क्या कोई यह समझा सकता है कि यह क्यों हो रहा है, और ऐसा क्यों करना कानूनी नहीं है।

ऐसा नहीं है कि मैं वास्तव में ऐसा करना चाहता था, लेकिन मैं जेनिक्स के साथ ऐसा कुछ करने की कोशिश करते समय एक समस्या के दौरान कैमरे और प्रभावशाली ढंग से कवर के तहत क्या हो रहा है। यानी

public T dosomething<T>(short val) where T : new() 
{ 
    T result = (T)(object) val; 
    return result; 
} 

तो क्या मैं क्या करने की कोशिश कर रहा हूँ एक सामान्य समारोह है कि एक अपवाद फेंकने के बिना enums और गैर enums (इतनी गंभीर-नहीं बल्कि अच्छा होगा) एक छोटी मान पर सेट किया जा सकता है कि साथ काम करता है और वास्तव में सही enum मूल्य शुरू करना।

+21

टाइप यह लाइन से बाहर होगा बाहर बात करने के लिए बदलने के लिए नहीं करना चाहती है कि मेंढक और टॉड क्रस्टेसियन नहीं हैं?:) – JTMon

+1

संभावित डुप्लिकेट [मैं दशमलव के रूप में int को अनबॉक्स क्यों नहीं कर सकता?] (Http://stackoverflow.com/questions/1085097/why-cant-i-unbox-an-int-as-a-decimal) –

+2

@sweetfa: जबकि प्रश्न मैंने int बनाम दशमलव के साथ सौदों की ओर इशारा किया है, न कि enums, यह व्यवहार (जो मुक्केबाजी और unboxing से संबंधित है) की व्याख्या करता है। विशेष रूप से, स्वीकृत उत्तर एरिक लिपर्ट द्वारा एक लेख को संदर्भित करता है: "[प्रतिनिधित्व और पहचान] (http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx) ", जो इसे बहुत विस्तार से बताता है। –

उत्तर

30

इस तरह शायद तुम्हारी मदद करेगा:

public T dosomething<T>(object o) 
{ 
    T enumVal= (T)Enum.Parse(typeof(T), o.ToString()); 
    return enumVal; 
} 

लेकिन इस Enum.Parse(..)

का उपयोग करने का enums साथ केवल काम करेंगे, स्पष्ट कारण के लिए और इस तरह उपयोग करते हैं, उदाहरण के लिए:

object o = 4; 
dosomething<Crustaceans>(o); 

यह Toad में वापस आ जाएगा आपके मामले।

+1

इसे कोड के आस-पास एक एनम या चेक के साथ चेक के साथ तय किया जा सकता है या इसलिए की तरह एक पूर्णांक (enum टी है) –

+0

सुधार करता है, तो संस्करण (?): सार्वजनिक टी DoSomething (वस्तु ओ) { वर enumType = typeof (टी); अगर (! EnumType.IsEnum) नया ArgumentException फेंक दें ("एक enum" नहीं); वापसी (टी) कनवर्ट करें। चेंजटाइप (ओ, एनम टाइप); } – osexpert

-1

ऐसे मामले हैं जब आप जेनिक्स का उपयोग नहीं कर सकते हैं (जैसे कि जब आप object के रूप में मान प्राप्त करते हैं तो एक WPF कनवर्टर में)। इस मामले में आप int पर नहीं डाले जा सकते हैं क्योंकि enum प्रकार int नहीं हो सकता है। जेनिक्स के बिना ऐसा करने का यह एक सामान्य तरीका है। उदाहरण एक WPF कनवर्टर के अंदर दिया जाता है, लेकिन कोड के अंदर सामान्य है:

using System; 
using System.Windows; 
using System.Windows.Data; 

. 
. 
. 

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    var enumType = value.GetType(); 
    var underlyingType = Enum.GetUnderlyingType(enumType); 
    var numericValue = System.Convert.ChangeType(value, underlyingType); 
    return numericValue; 
} 
0

डिफ़ॉल्ट enum अंकों मूल्यों से है प्रकार = पूर्णांक। अपने कोड में आप उस मूल्य को कास्ट करना चाहते हैं जिसमें छोटे प्रकार के एनम प्रकार हैं। इसके लिए, आपको अपने enum मानों के लिए संक्षिप्त प्रकार सेट करना होगा। यह काम करेगा:

public enum Crustaceans : short // <-- 
{ 
    Frog = 1, 
    Toad = 4 
} 

short @short = 1; 
object @object = @short; 

var @enum = (Crustaceans)@object; // @enum = Crustaceans.Frog 

यदि आप डिफ़ॉल्ट enum मूल्यों

public enum Crustaceans 
{ 
    Frog = 1, 
    Toad = 4 
} 

object @object = Crustaceans.Frog; 

var @enum = (Crustaceans)@object; // @enum = Crustaceans.Frog 

या

public enum Crustaceans 
{ 
    Frog = 1, 
    Toad = 4 
} 

int @integer= 1; 

var @enum = (Crustaceans)@integer; // @enum = Crustaceans.Frog 
संबंधित मुद्दे