List<T>.GetEnumerator()
एक परिवर्तनशील मान प्रकार (List<T>.Enumerator
) देता है। आप अज्ञात प्रकार में उस मान को संग्रहीत कर रहे हैं।
while (x.TempList.MoveNext())
{
// Ignore this
}
कि बराबर है करने के लिए:: - मूल्य का प्रतिलिपि
while (true)
{
var tmp = x.TempList;
var result = tmp.MoveNext();
if (!result)
{
break;
}
// Original loop body
}
अब ध्यान दें कि हम क्या पर MoveNext()
कॉल कर रहे हैं
अब, चलो इस क्या करता है पर एक नजर डालते हैं जो अनाम प्रकार में है। आप वास्तव में गुमनाम प्रकार में मान नहीं बदल सकते हैं - जो कुछ आपको मिला है वह वह संपत्ति है जिसे आप कॉल कर सकते हैं, जो आपको मूल्य की एक प्रति देगी।
आप के लिए कोड को बदलते हैं:
var x = new { TempList = (IEnumerable<int>) new List<int> { 1, 3, 6, 9 }.GetEnumerator() };
... तो आप गुमनाम प्रकार में एक संदर्भ हो रही समाप्त कर देंगे। म्यूटेबल वैल्यू वाले बॉक्स का संदर्भ। जब आप उस संदर्भ पर MoveNext()
पर कॉल करते हैं, तो बॉक्स के अंदर का मान उत्परिवर्तित हो जाएगा, इसलिए यह वही करेगा जो आप चाहते हैं।
एक समान स्थिति पर विश्लेषण के लिए (फिर List<T>.GetEnumerator()
का उपयोग करके) my 2010 blog post "Iterate, damn you!" देखें।
स्रोत
2015-07-23 15:08:28
मैं इसे देख रहा हूं और यह पता लगाने में परेशानी है कि यहां कौन सा तत्व एक मूल्य प्रकार है जिसके लिए प्रतिलिपि/संदर्भ भेद वास्तव में एक फर्क पड़ता है। –
मुझे यह नहीं मिला, यह ठीक काम करता है अगर हम इसे '' numerumerable ''?? @ जोनस्केट आप इसे सरल शब्दों में अधिक समझा सकते हैं –
@ एहसान सजद: जब 'टेम्पललिस्ट' का संकलन-समय प्रकार 'आईनेमेरेबल' है, तो इसका उपयोग केवल एक संदर्भ की प्रतिलिपि बनाता है। उस संदर्भ पर कार्य करने से बॉक्स किए गए मान को म्यूटेट कर दिया जाएगा, और अगली बार जब आप कोई संदर्भ कॉपी करेंगे तो यह अभी भी उसी बॉक्स किए गए मान को संदर्भित करेगा, इसलिए आप परिवर्तन देखेंगे। उस मूल्य की प्रतिलिपि बनाने और उस प्रति को म्यूट करने के साथ तुलना करें - जब आप * अगली * मूल मान की प्रतिलिपि बनाते हैं, तो आपको पिछले परिवर्तन दिखाई नहीं देंगे। –