मैं कक्षा विस्तार से काफी परिचित हूं, लेकिन निम्नलिखित व्यवहार की अपेक्षा नहीं कर रहा था।

मुझे उम्मीद थी कि निम्नलिखित सिस्टम का विस्तार करेंगे। ऐरे, लेकिन ऐसा नहीं हुआ। इसके बजाय, इसने System.Array के उदाहरण का विस्तार किया। क्यों?

public static T[] Concatenate<T>(this Array value1, Array value2)
{
    int l1 = value1 == null ? 0 : value1.Length;
    int l2 = value2 == null ? 0 : value2.Length;

    T[] result = new T[l1 + l2];

    if (l1 > 0)
    {
        Array.Copy(value1, 0, result, 0, l1);
    }

    if (l2 > 0)
    {
        Array.Copy(value2, 0, result, l1, l2);
    }

    return result;
}

...

सरणी। // कोई Concatenate . नहीं

string[] s = new string[1];
s.Concatenate<string>... // appears here
2
IamIC 13 जुलाई 2011, 20:32
6
मैं आपके दावे पर सवाल उठाऊंगा कि आप "कक्षा एक्सटेंशन से काफी परिचित हैं" - मान लीजिए कि आपका मतलब विस्तार विधियों से है, यह पूरी तरह से सामान्य व्यवहार है। विस्तार विधियों पर फिर से पढ़ने का समय?
 – 
Jon Skeet
13 जुलाई 2011, 20:38

1 उत्तर

सबसे बढ़िया उत्तर

क्योंकि आप केवल प्रकार के उदाहरणों के लिए विस्तार विधियों को परिभाषित कर सकते हैं। उन्हें आमंत्रित करने के लिए आप या तो वाक्य रचना की तरह इंस्टेंस-विधि मंगलाचरण का उपयोग करें

var result = s.Concatenate(t);

या मानक स्थैतिक-विधि मंगलाचरण वाक्य रचना

var result = ArrayExtensions.Concatenate(s, t);

दोबारा, आप Array में विधियों को नहीं जोड़ सकते, केवल Array के उदाहरणों के लिए (और वास्तव में, आप विधियों को नहीं जोड़ रहे हैं, यह केवल एक कंपाइलर चाल है जो इसे आपके जैसा दिखता है)।

वैसे, मैं आपकी विधि को इस प्रकार लिखूंगा:

return value1.Concat(value2).ToArray();
5
jason 13 जुलाई 2011, 20:42
मुझे आपका सुझाव नहीं मिला। Concat स्ट्रिंग्स पर काम करता है, सरणियों पर नहीं।
 – 
IamIC
13 जुलाई 2011, 20:57
2
@IanC: मैंने System.Linq.Enumerable.Concat का इस्तेमाल किया।
 – 
jason
13 जुलाई 2011, 23:05