मैं दावा नहीं कर रहा हूं कि इस उत्तर में कोड उपयोगी है, लेकिन (यह काम करता है और) मुझे लगता है कि यह आपके दृष्टिकोण को काम करने के लिए आपको जो चाहिए, उसे दिखाता है। तर्क ref
चिह्नित किया जाना चाहिए।बीसीएल ref
साथ एक प्रतिनिधि प्रकार नहीं है, तो बस अपने खुद के बारे में (किसी भी वर्ग के अंदर नहीं):
public delegate void MyActionRef<T>(ref T arg);
इसी के साथ
, अपने विधि हो जाता है:
public static void ForEach2<T>(this T[] list, MyActionRef<T> actionRef)
{
if (actionRef == null)
throw new ArgumentNullException("actionRef");
for (int idx = 0; idx < list.Length; idx++)
{
actionRef(ref list[idx]);
}
}
अब, उपयोग करने के लिए याद अपने परीक्षा पद्धति में ref
कीवर्ड:
numbers.ForEach2((ref int num) =>
{
num = 0;
});
यह काम करता है, क्योंकि यह एक सरणी प्रविष्टि ByRef (ref
) पारित करने के लिए ठीक है।
public static void ForEach3<T>(this IList<T> list, MyActionRef<T> actionRef)
{
if (actionRef == null)
throw new ArgumentNullException("actionRef");
for (int idx = 0; idx < list.Count; idx++)
{
var temp = list[idx];
actionRef(ref temp);
list[idx] = temp;
}
}
आशा इस बारे में अपनी समझ में मदद करता है:
आप IList<>
बजाय का विस्तार करना चाहते हैं, तो आप क्या करना है।
नोट: मुझे for
लूप का उपयोग करना पड़ा। सी # में, foreach (var x in Yyyy) { /* ... */ }
में, इसे x
को असाइन करने की अनुमति नहीं है (जिसमें x
बीरफ (ref
या out
के साथ) लूप बॉडी के अंदर गुजरना शामिल है।
स्रोत
2014-11-28 12:43:57
@ 249076: हाँ यह काम करेगा। –
मैं सहमत हूं कि मैं लूप के लिए क्या चाहता हूं, लेकिन जब कॉल टू एक्शन किया जाता है तो तर्क मूल्य द्वारा पारित किया जाता है, तो मैं इसे एक विस्तार विधि में कैसे काम करूंगा? ऐसा लगता है कि फॉरएच फ़ंक्शन को पास किए गए कार्य प्रतिनिधि के संदर्भ में मान को पास करने का कोई तरीका नहीं है। मुझे लगता है कि हर कोई इसे जानता है, लेकिन मुझे एहसास नहीं हुआ कि foreach (संख्याओं में int num) {num = 0; } काम नहीं करेगा। संख्या एक अस्थायी प्रति क्यों है और संदर्भ नहीं है? मुझे लगता है कि foreach सिर्फ "के लिए" के लिए वाक्य रचनात्मक चीनी था। मुझे लगता है मुझे इतनी सारी धारणाएं रोकने की जरूरत है। – 249076
मैं लिखने के लिए कुछ तरीका समझना चाहता हूं कि प्रत्येक एक्सटेंशन के लिए यह एक int के मान को बदल सकता है। मुझे लगता है कि यह समझ में आता है, लेकिन यह एक पहेली है जिसे मैं हल करना चाहता हूं। – 249076