2012-09-07 19 views
10

स्ट्रिंग्स को एनम वैल्यू में कनवर्ट करने के बारे में बहुत सारे प्रश्न हैं। आम तौर पर, इस सवाल का जवाब this question पर जवाब तरह दिखता है: है कि एक पूरी तरह से उचित जवाब है, और आप कॉल को आसान बनाने के लिए एक विधि लिख सकते हैंEnum.Parse() वापसी वस्तु क्यों करता है?

StatusEnum MyStatus = (StatusEnum) Enum.Parse(typeof(StatusEnum), "Active", true); 

, इसके बारे में क्यों Enum सवाल का जवाब नहीं है। पार्स() उपयुक्त एनम मूल्य के बजाय object देता है। मुझे इसे StatusEnum पर क्यों डालना है?


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

असल में, सवाल यह है कि क्यों है यह नहीं Enum वर्ग का हिस्सा की तरह एक समारोह?

public static T Parse<T>(string value) where T: struct 
    { 
     return (T)Enum.Parse(typeof (T), value); 
    } 

यह फ़ंक्शन पूरी तरह से ठीक काम करता है, ठीक वही करता है जो आप उम्मीद करेंगे। StatusEnum e = Enum.Parse<StatusEnum>("Active");

+1

@ SpYk3HH - Enums * मान * नहीं है। वे * मूल्य हैं। वे मान हैं जो '.ToString()' के लिए सामान्य अधिभार होता है, लेकिन वे अभी भी मान हैं। – Bobson

+2

.NET 4.0+ में ['Enum.TryParse '] (http://msdn.microsoft.com/en-us/library/dd783499 (v = vs.100)) –

+0

@ SpYk3HH एनम प्रकार का मान है कुछ पूर्णांक जो enum प्रकार के फ़ील्ड में से एक से जुड़ा हो सकता है। पूर्णांक का आकार भिन्न हो सकता है। पार्स कुछ स्ट्रिंग लेता है और enum प्रकार का एक बॉक्सिंग उदाहरण देता है। यह अनबॉक्स किया जा सकता है या नहीं। आपकी आखिरी वाक्य भी कोई समझ नहीं लेती है। स्ट्रिंग और बूलियन में गुण और विधियां भी हैं जिन पर काम करना है। – phoog

उत्तर

10

यह करता है इस वजह

  1. यह जेनेरिक predated और (भले ही
  2. जेनेरिक बाधाओं :) नहीं था enums (मुख्यधारा नेट भाषाओं में)
नहीं किया जा सकता

ऐसे में, Object एकमात्र प्रकार है जो हमेशा किसी भी प्रकार के enum के लिए काम करेगा।

ऑब्जेक्ट लौटने से, एपीआई कम से कम कार्यात्मक है, भले ही एक कलाकार की आवश्यकता हो।

+1

जबकि आप यह नहीं कह सकते कि 'कहां टी: एनम' आप कहां कह सकते हैं 'कहां टी: स्ट्रक्चर' और कम से कम संदर्भ प्रकारों को खत्म कर सकते हैं, या कोई बाधा नहीं डाल सकते हैं और कास्ट/टाइपफ से बच सकते हैं। – Guvante

+0

तथ्य यह है कि यह जेनेरिक भविष्यवाणी की गई एक व्याख्या नहीं है। पुरानी शैली 'Enum.Parse() 'के लिए ओवरलोड के रूप में संपादित किए गए फ़ंक्शन को जोड़ने के लिए यह एक गैर-ब्रेकिंग परिवर्तन होगा। – Bobson

+0

@Reed - इसके तर्क के बारे में सोचने के लिए आओ, Enum.TryParse () या तो मौजूद नहीं होना चाहिए, लेकिन ऐसा करता है। – Bobson

1

वस्तु का वास्तविक प्रकार वास्तव में StatusEnum है। संकलक, और कोड, Enum.Parse लिखते समय यह नहीं पता कि विधि के समय उस रनटाइम ऑब्जेक्ट का क्या होगा। यह तब तक ज्ञात नहीं होगा जब तक कि विधि वास्तव में नहीं कहा जाता है। यदि आप FooEnum ret; के रूप में बाहर मूल्य सेवानिवृत्त निर्दिष्ट करते हैं, इसलिए

Enum.TryParse<FooEnum>(name, true, out ret);

, आप एक FooEnum बाद में करने के लिए इसे कास्ट करने के लिए की जरूरत नहीं होगी;:

3

TryParse लेकिन एक प्रकार पैरामीटर का समर्थन नहीं करता यह तुरंत उचित प्रकार का होगा।

+0

यह सच है, लेकिन अब आपको कोड की दो पंक्तियों की आवश्यकता है। शायद तीन। एक 'ret' घोषित करने के लिए, यह एक, और एक इसका उपयोग करने के लिए जो आपको अन्यथा आवश्यक नहीं हो सकता है। इस प्रकार सवाल उठाते हुए कि 'TryParse() 'का एक सामान्य रूप क्यों है और' पार्स()' का सामान्य रूप नहीं है। – Bobson

+0

शायद यह सिर्फ अनदेखा है। हालांकि आप एक विस्तार विधि के रूप में अपना खुद का सामान्य अधिभार बना सकते हैं। – aevitas

+0

असल में, आप नहीं कर सकते। आप 'एनम' का विस्तार नहीं कर सकते, क्योंकि यह एक स्थिर वर्ग है। तो आप 'EnumExtensions.Parse() '(या जो भी आप अपनी कक्षा कहलाते हैं) को कॉल करेंगे, और एक्सटेंशन विधि होने का कोई फायदा नहीं होगा। – Bobson

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