2012-02-03 4 views
8

इसXmlNodeList लूप में var infer प्रकार ऑब्जेक्ट और XmlNode क्यों नहीं है?

foreach (XmlNode foo in xmlNodeList) {string baa = foo.Attributes["baa"].Value;} 

सब कुछ काम करता है के रूप में उम्मीद की तरह एक XmlNodeList के माध्यम से लूप है - foo प्रकार XmlNode और VS.NET IDE का स्पष्ट रूप से है तरीकों और क्षेत्रों को दर्शाता है।

दूसरी ओर

foreach (var foo in xmlNodeList) { string baa = foo.Attributes["baa"].Value; } 

पर संकलन नहीं है, क्योंकि यहां foo के प्रकार वस्तु है। अनुमानों का प्रकार टाइप करें लेकिन ऑब्जेक्ट infers।

जाहिर है, XmlNodeList के तत्वों एक परिभाषित प्रकार के नहीं हैं, लेकिन उन्हें वर के बजाय XmlNode को बताए (कास्टिंग या unboxing) परोक्ष कुछ नहीं करता है।

पहला प्रश्न: इसके पीछे तंत्र क्या है?

दूसरा (संबंधित) प्रश्न: इस प्रकार के लूप में किस प्रकार का उपयोग किया जा सकता है? क्या वीएसनेट आईडीई मदद करता है?

+1

आप system.xml.linq नाम स्थान में कक्षाओं का उपयोग करने के रूप में वे अन्य लोगों के अलावा IEnumerable जेनेरिक संस्करण को लागू करना चाह सकते हैं। इन वर्गों का उपयोग करते समय var को सही ढंग से अनुमानित किया जाना चाहिए। वाईएमएमवी –

+0

@ क्रिस: संकेत के लिए धन्यवाद - मैं जांच करूंगा। – Olaf

+0

+1, मैं बस एक ही प्रश्न पूछने जा रहा था :-) –

उत्तर

9

XmlNodeList केवल गैर-जेनेरिक IEnumerable इंटरफ़ेस लागू करता है, और जेनिक्स के साथ IEnumerable<XmlNode> जैसी कुछ नहीं। यह आपके तत्वों के मजबूत टाइपिंग को तब तक रोकता है जब तक आप उचित तरीके से नहीं डाले जाते हैं, इसलिए संकलक के पास आपके प्रस्ताव में object पर निहित प्रकार की घोषणा को मानचित्रित करने के अलावा कोई विकल्प नहीं है।

आप var कीवर्ड का उपयोग पर जोर देते हैं, तो आप ऐसा तरह xmlNodeList के तत्वों डाली कर सकते हैं:

foreach (var foo in xmlNodeList.Cast<XmlNode>()) 
{ 
    string baa = foo.Attributes["baa"].Value; 
} 

लेकिन वह बदसूरत है, और वैसे भी अधिक कीस्ट्रोक्स की आवश्यकता है। आप स्पष्ट रूप से XmlNode foo घोषित कर सकते हैं, और फोरच को फ्लाई पर आपके लिए डालने दें।

+0

बहुत बहुत धन्यवाद, समझा! मैं बदसूरत नहीं चाहता, लेकिन जैसा कि मैंने जॉन को अपनी टिप्पणी में लिखा था, सवाल आंशिक रूप से एक व्यावहारिक हिस्सा था: यदि रिशेर्पर मुझे 'var' देता है, तो असली प्रकार खोजने का सबसे तेज़ तरीका क्या है? – Olaf

+1

जैसा कि डैनियल हिल्गार्थ बताते हैं, ऐसा करने का सबसे आसान तरीका दस्तावेज़ीकरण को देखकर है। – BoltClock

4

बोल्टक्लॉक नोट्स के रूप में, XmlNodeList केवल IEnumerable लागू करता है।

foreach पाश स्वचालित रूप से पर्दे के पीछे आप के लिए कास्टिंग करता है, इसलिए यह:

List<object> values = new List<object> { "x", "y", "z" }; 
foreach (string x in values) 
{ 
    ... 
} 

पूरी तरह से कानूनी है, और प्रत्येक मूल्य पर एक डाली (जो निश्चित रूप से, एक अपवाद फेंक कर सकते हैं) करता है।

यह मेरे लिए वास्तव में स्पष्ट नहीं है कि आप अपने दूसरे प्रश्न से क्या मतलब रखते हैं - लेकिन मैं बस अनुशंसा करता हूं कि आप अपने लूप में XmlNode का स्पष्ट रूप से उपयोग करें। आप वास्तव मेंvar का उपयोग करना चाहते हैं, तो आप लिख सकते हैं:

foreach (var foo in xmlNodeList.Cast<XmlNode>()) 

लेकिन है कि मेरे पास overkill की तरह लगता है ...

+0

धन्यवाद, IENumerable बनाम IENumerable इसे समझाता है! मेरे दूसरे प्रश्न के साथ मेरा मतलब था: इस तरह के मामले में, इस मामले में 'XmlNode' की आवश्यकता वाले आइटम प्रकार को ढूंढने का सबसे तेज़ तरीका क्या है? रिशेर्पर मुझे 'var' देता है, इसलिए मैं सोच रहा था कि क्या वीएस.नेट ने इसे अपने इंटेलिजेंस में कहीं छुपाया है। – Olaf

+3

@ ओलाफ: नहीं, इस पर कोई इंटेलिजेंस नहीं हो सकता है, क्योंकि जानकारी बस वहां नहीं है। आपको यह जानने की जरूरत है कि आप क्या कर रहे हैं - आपको वैसे भी चाहिए, बेशक :) –

+0

यही वह है जिसे मैं जानना चाहता था (जानकारी बस वहां नहीं है)। मुझे यह जानने में मदद करने के लिए धन्यवाद कि मैं क्या कर रहा हूं! क्यों समझाए जाने के लिए – Olaf

4

XmlNodeList .NET फ्रेमवर्क में कर दिया गया है इससे पहले कि यह जेनरिक का समर्थन किया। इसके कारण, यह केवल गैर-जेनेरिक इंटरफ़ेस IEnumerable लागू करता है और सामान्य IEnumerable<T> नहीं।
यह जानने के लिए कि इस सूची में कौन से प्रकार हो सकते हैं आपको दस्तावेज़ों को पढ़ने की आवश्यकता है। सबसे अच्छा तरीका indexer है।

Btw: आईडीई VS.NET नहीं बुलाया गया है के बाद से विजुअल स्टूडियो 2005 :-) यह जारी किया गया था केवल तब से वी.एस. कहा जाता है।

+0

+1। मैं .NET में XML एपीआई से बहुत परिचित नहीं हूं ... – BoltClock

+0

धन्यवाद, वीएस.NET संकेत के लिए भी (हम अभी भी इसे आंतरिक रूप से उपयोग कर रहे हैं)! – Olaf

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