मेरे पास निम्न कोड स्निपेट है C #:
var actions = new list & lt; Func & lt ; पूर्णांक & gt; & gt; (); IEnumerable & LT; पूर्णांक & gt; मान = नई सूची & lt; int & gt; {1, 2, 3}; विदेशी मुद्रा (मूल्यों में अंतर मान) {actions.Add ((=) = & gt; मान * मान); } Foreach (कार्य में कार्रवाई) {Console.WriteLine (कार्रवाई ()); ; } कंसोल। रीडलाइन ();
यह ठीक चल रहा है, लेकिन मुझे उम्मीद है कि परिणाम प्राप्त नहीं हो रहा है।
वास्तविक परिणाम
9, 9, 9
अपेक्षित परिणाम
1,4 9
मुझे उम्मीद है कि मुझे नतीजे क्यों नहीं मिल रहा है?
आप अपने लैम्ब्डा अभिव्यक्ति में लूप वैरिएबल को कैप्चर कर रहे हैं, जिसका अर्थ है कि जब प्रतिनिधि को अंततः लागू किया जाता है, तो यह देख रहा है लूप चर का अंतिम मान।
सरल तय:
foreach (मानों में इंट मूल्य) {int copy = value; Actions.Add (() = & copy; कॉपी * प्रतिलिपि); }
इस तरह से आपको लूप के प्रत्येक पुनरावृत्त में एक नया copy
वेरिएबल मिलता है, इसलिए प्रत्येक प्रतिनिधि अभिव्यक्ति एक अलग चर पर कब्जा करेगी, और वे प्रभावित नहीं होंगे
एरिक लिपर्ट इस (और) में अच्छी तरह से बताता है।
असल में यह एक "gotcha" है सी # जो लगभग हर किसी के लिए जल्दी या बाद में गिर जाता है।
No comments:
Post a Comment