2009-10-23 13 views
7

में पाश मैं इस कोड (सी #) की है।
त्रुटि है:foreach में अद्यतन Struct सी #

Cannot modify members of 't' because it is a 'foreach iteration variable' 

अगर मैं एक class बजाय एक struct को Thing बदलने के लिए, तथापि, यह संकलित करता है।

कृपया कोई बता सकता है कि क्या हो रहा है?

+0

संबंधित प्रश्न http://stackoverflow.com/questions/1538301/c-does-foreach-iterate-by-reference/1538316#1538316 –

+0

लिंक के लिए धन्यवाद, ब्रायन। –

उत्तर

9

यह कहता है कि कम या ज्यादा, कंपाइलर आपको फोरच में लूपिंग var (भागों) को बदलने नहीं देगा।

, बस का उपयोग करें:

for(int i = 0; i < things.Count; i+= 1) // for each file 
{ 
    things[i].Name = "xxx"; 
} 

और यह काम करता है क्योंकि उसके बाद अपने पाशन वर एक संदर्भ है जब Thing एक वर्ग है, और आप केवल संदर्भित वस्तु में परिवर्तन, संदर्भ में ही नहीं हैं।

+0

बिल्कुल वही जो मैं खोज रहा था! धन्यवाद, हेनक :) –

7

एक संरचना कोई संदर्भ प्रकार नहीं है लेकिन एक मान प्रकार है।

आप Thing के लिए एक struct के बजाय एक class चाहते हैं, तो foreach पाश आप के लिए एक संदर्भ चर बना होता है, कि आप में सही तत्व को इंगित करेंगे की सूची। लेकिन चूंकि यह एक मान प्रकार है, यह केवल आपके Thing की एक प्रति पर काम करता है, जो इस मामले में पुनरावृत्ति चर है।

+0

हां, यह प्रासंगिक है। चूंकि यह एक मान प्रकार है, पूरी संरचना लूपिंग चर है और इसलिए इसका कोई भी भाग संशोधित नहीं किया जा सकता है। –

+0

differene, जोहान्स को समझाते हुए धन्यवाद। बहुत सराहना की। +1 –

1

एक वैकल्पिक वाक्य रचना है कि मैं @ करने के लिए पसंद हेंक का समाधान यह है: यही कारण है कि यह संकलित जब यह एक वर्ग है, लेकिन नहीं, जब यह एक struct

देखें है अधिक है।

DateTime[] dates = new DateTime[10]; 

foreach(int index in Enumerable.Range(0, dates.Length)) 
{ 
    ref DateTime date = ref dates[index]; 

    // Do stuff with date. 
    // ... 
} 

आप पाश में काम के लिए उचित समय कर रहे हैं तो अनुक्रमण को दोहराने के लिए नहीं होने के लिए हर जगह imo आंखों पर आसान है।

पीएस डेटटाइम वास्तव में वास्तव में एक खराब उदाहरण है क्योंकि इसमें कोई भी गुण नहीं है जिसे आप सेट कर सकते हैं, लेकिन आपको तस्वीर मिलती है।

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