static void Main(string[] args)
{
List<int> listArray = new List<int>();
listArray.Add(100);
foreach (int item in listArray)
Console.WriteLine(item);
}
क) foreach
बयान listArray's IEnumerable<int>.GetEnumerator()
कार्यान्वयन की आवश्यकता होने पर, यह इसके listArray.GetEnumerator()
या IEnumerable<int>.GetEnumerator()
या IEnumerable.GetEnumerator()
के माध्यम से फोन करता है?foreach कॉल GetEnumerator() कैसे कॉल करता है? IENumerable संदर्भ के माध्यम से या ... के माध्यम से?
ख) इसी प्रकार, जब foreach
संदर्भ listArray's IEnumerable<int>.GetEnumerator()
द्वारा दिया वस्तु, यह इस वस्तु IEnumerator
या IEnumerator<int>
संदर्भ प्रकार के माध्यम से संदर्भ करता है?
धन्यवाद
संपादित करें:
मेरे सवालों का इस पाठ बोली जाएगा में से कुछ:
ओ पहचानकर्ता GetEnumerator साथ प्रकार एक्स पर सदस्य लुकअप निष्पादित और कोई प्रकार तर्क । यदि सदस्य लुकअप कोई मेल नहीं बनाता है, या एक अस्पष्टता उत्पन्न करता है, या मैच बनाता है जो एक विधि समूह नहीं है, नीचे वर्णित के रूप में एक समेकित इंटरफ़ेस की जांच करें। की अनुशंसा की जाती है कि अगर लुकअप विधि समूह या कोई मिलान को छोड़कर कुछ भी उत्पन्न करता है तो चेतावनी जारी की जाएगी।
o परिणामी विधि समूह और खाली तर्क सूची का उपयोग करके का उपयोग करके ओवरलोड रिज़ॉल्यूशन करें। लागू नहीं तरीकों में अधिभार संकल्प परिणाम, एक अस्पष्टता, या परिणाम एक भी सबसे अच्छा तरीका में लेकिन कि विधि या तो स्थिर है या सार्वजनिक नहीं है में परिणाम एक गणनीय इंटरफेस के लिए जाँच तो नीचे वर्णित के रूप में। यह अनुशंसा की जाती है कि एक चेतावनी जारी की जाए यदि ओवरलोड रिज़ॉल्यूशन किसी अस्पष्ट सार्वजनिक इंस्टेंस विधि को छोड़कर या लागू विधियों को छोड़कर कुछ भी उत्पन्न करता है।
ओ तो GetEnumerator विधि की वापसी प्रकार ई एक वर्ग नहीं है, struct या इंटरफ़ेस प्रकार, एक त्रुटि उत्पादित है और आगे नहीं चरणों लिया है।
ओ सदस्य लुकअप पहचानकर्ता वर्तमान के साथ ई पर किया गया है और प्रकार तर्क हैं। यदि सदस्य लुकअप कोई मिलान नहीं करता है, तो परिणाम त्रुटि है, या नतीजा है जो सार्वजनिक उदाहरण संपत्ति को छोड़कर पढ़ने की अनुमति देता है, एक त्रुटि उत्पन्न होती है और कोई और कदम नहीं उठाया जाता है।
o सदस्य लुकअप पहचानकर्ता MoveNext और कोई प्रकार तर्कों के साथ ई पर किया जाता है। यदि सदस्य लुकअप कोई मिलान नहीं करता है, तो परिणाम त्रुटि है, या परिणाम किसी विधि समूह को छोड़कर कुछ भी है, एक त्रुटि उत्पादित है और कोई और कदम नहीं लिया गया है।
ओ ओवरलोड रिज़ॉल्यूशन पर एक खाली तर्क सूची वाला विधि समूह पर किया जाता है। अगर अधिभार संकल्प एक भी सबसे अच्छा तरीका में लागू नहीं तरीकों में परिणाम, परिणाम एक अस्पष्टता में, या परिणामों लेकिन यह है कि विधि है या तो स्थिर है या सार्वजनिक नहीं, या उसके वापसी प्रकार bool नहीं है, एक त्रुटि उत्पादित है और कोई और कदम नहीं उठाए गए हैं।
ओ संग्रह प्रकार, एक्स है प्रगणक प्रकार ई है, और तत्व प्रकार वर्तमान संपत्ति का प्रकार है।
अन्यथा, एक गणनीय इंटरफेस के लिए जाँच: ओ यदि वहाँ वास्तव में एक प्रकार टी इस तरह के एक अंतर्निहित इंटरफ़ेस System.Collections.Generic.IEnumerable को एक्स से रूपांतरण होता है, तो संग्रह प्रकार इस इंटरफेस है, प्रगणक प्रकार इंटरफ़ेस System.Collections.Generic.IEnumerator, है और तत्व प्रकार,
अन्यथा टी
है अगर एक से अधिक इस प्रकार टी है, तो त्रुटि उत्पन्न होती है और कोई और कदम नहीं उठाए जाते हैं।अन्यथा, अगर वहाँ System.Collections.IEnumerable इंटरफ़ेस के लिए एक्स से एक अंतर्निहित रूपांतरण है, तो संग्रह प्रकार इस इंटरफेस, प्रगणक प्रकार System.Collections.IEnumerator है इंटरफ़ेस , और है तत्व प्रकार वस्तु है।
अन्यथा, एक त्रुटि उत्पन्न होती है और कोई और कदम नहीं लिया जाता है।
1) एरिक Lippert से
उद्धरण:
विकल्प (1) सही है। ध्यान दें कि यह का अर्थ है कि वापस आने वाला गणक एक अनबॉक्स किए गए परिवर्तनीय संरचना है।
तथ्य यह एक परिवर्तनशील struct बहुत ही वास्तविक असर पड़ता है अगर आप कुछ चारों ओर struct गुजर जैसे कि यह एक संदर्भ प्रकार थे जैसे मूर्ख करना है कि; इसे मान द्वारा प्रतिलिपि बनाई जाएगी, संदर्भ के अनुसार नहीं।
http://en.csharp-online.net/ECMA-334:_15.8.4_The_foreach_statement से:
foreach (एक्स में वी वी) एम्बेडेड बयान
तो करने के लिए विस्तारित किया गया है:
{ E e = ((C)(x)).GetEnumerator(); try { V v; while (e.MoveNext()) { v = (V)(T)e.Current; embedded-statement } } finally { … // Dispose e } }
चर ई करने के लिए या दिखाई नहीं देता है अभिव्यक्ति एक्स या एम्बेडेड कथन या किसी अन्य स्रोत के लिए सुलभकार्यक्रम के 0 कोड।
listArray
के मामले में, लौट आए प्रगणक में सहेजा जाता है (यानी अपने मूल्य सहेजा जाता है) अलग-अलग e
(इस प्रकार चर e
एक परिवर्तनशील struct है) .लेकिन ऊपर अंश के अनुसार, e
मेरे स्रोत के लिए नहीं पहुंच नहीं है कोड, तो मैं इस संरचना को चारों ओर कैसे पारित कर पाऊंगा (जब तक कि मैं कोड लिखता हूं जो मैन्युअल रूप से foreach
कथन स्वचालित रूप से करता है)?
2)
सदस्य देखने पहचानकर्ता वर्तमान और कोई प्रकार तर्क के साथ ई पर किया जाता है। यदि सदस्य लुकअप कोई मिलान नहीं करता है, तो परिणाम एक त्रुटि है, या नतीजा कुछ भी है जो सार्वजनिक आवृत्ति संपत्ति को छोड़कर पढ़ने की अनुमति देता है, एक त्रुटि उत्पन्न होती है और आगे के कदम नहीं उठाए जाते हैं।
ऐसा लगता है कि अगर हम कक्षा में GetEnumerator
लागू (X
) ही है, तो Current
भी वर्ग (E
) में, लागू किया जाना चाहिए ही (इस प्रकार E
स्पष्ट Current
लागू नहीं होना चाहिए) के बाद से संकलक नहीं होगा उन मामलों में IEnumerator<T>/IEnumerator
इंटरफ़ेस की जांच करने के लिए परेशान करें जहां सदस्य लुकअप (E
पर पहचानकर्ता Current
के साथ) कोई मिलान नहीं करता है?
3)
यदि वहाँ वास्तव में एक प्रकार टी इस तरह के इंटरफ़ेस System.Collections.Generic.IEnumerable को एक्स से एक अंतर्निहित रूपांतरण होता है, तो संग्रह प्रकार इस इंटरफेस, है प्रगणक प्रकार इंटरफ़ेस System.Collections.Generic.IEnumerator है, और तत्व प्रकार टी
ऊपर के अनुसार,है अगर foreach
IEnumerable<T>
इंटरफेस के लिए जाँच करने के लिए है, तोCurrent
के IEnumerator<T>
संस्करण का उपयोग करेगा? इस प्रकार, यदि E
स्पष्ट Current
की IEnumerator<T>
संस्करण को भी लागू और अगर यह भी वर्ग अपने आप में Current
का एक और संस्करण को भी लागू foreach
हमेशा Current
की IEnumerable<T>
संस्करण फोन करेगा?
4)
GetEnumerator विधि इनमें से किसी एक लौटने के रूप में दर्ज है:
क्या आप बहुवचन में के रूप में इन की एक (मतलब है)? आपके द्वारा प्रदान किया गया लिंक कहता है GetEnumerator
(जैसा कि List<T>
द्वारा कार्यान्वित किया गया है) केवल struct
प्रकार देता है।
5)
जी। संग्रह प्रकार एक्स है, प्रगणक प्रकार ई है, और तत्व प्रकार वर्तमान संपत्ति
शायद एक बेकार सवाल के प्रकार है - ऊपर के अनुसार, foreach
जाँच नहीं करता तत्वों कुछ उपयोगकर्ता- किस प्रकार परिभाषित संग्रह वास्तव में स्टोर करता है, लेकिन इसके बजाय मानता है कि तत्वों का प्रकार Current
संपत्ति द्वारा लौटाए गए प्रकार के समान है?
क्या आपने स्वयं को खोजने के लिए एक सरल परीक्षा लिखने पर विचार किया है? यह एक वर्ग लिखने के लिए बहुत छोटा होगा जो 'IEnumerable.GetEnumerator()' और GetEnumerator() लागू करता है और अलग-अलग समकक्षों को वापस भेजता है। – Aren
मैंने आपके अतिरिक्त प्रश्नों को हल करने के लिए अपना उत्तर अपडेट कर दिया है। –