खोज…


टिप्पणियों

ओवरलोड रिज़ॉल्यूशन की प्रक्रिया को सी # विनिर्देश , खंड 7.5.3 में वर्णित किया गया है । इसके अलावा संबंधित खंड 7.5.2 (प्रकार का अनुमान) और 7.6.5 (आह्वान अभिव्यक्ति) हैं।

ओवरलोड रिज़ॉल्यूशन कार्य कैसे संभवत: C # 7 में बदले जाएंगे। डिज़ाइन नोटों से संकेत मिलता है कि Microsoft यह निर्धारित करने के लिए एक नई प्रणाली रोल करेगा कि कौन सी विधि बेहतर है (जटिल परिदृश्यों में)।

मूल ओवरलोडिंग उदाहरण

इस कोड में हैलो नामक एक अधिभार विधि है:

class Example
{
    public static void Hello(int arg)
    {
        Console.WriteLine("int");
    }
 
    public static void Hello(double arg)
    {
        Console.WriteLine("double");
    }
 
    public static void Main(string[] args) 
    {
        Hello(0);
        Hello(0.0);
    }
}

जब मुख्य विधि को बुलाया जाता है, तो यह प्रिंट होगा

int
double

संकलन-समय पर, जब कंपाइलर Hello(0) कॉल करता है, तो उसे Hello के नाम से सभी तरीके मिलते हैं। इस मामले में, यह उनमें से दो को पाता है। फिर यह निर्धारित करने की कोशिश करता है कि कौन सी विधि बेहतर है । कौन सी विधि बेहतर है यह निर्धारित करने के लिए एल्गोरिथ्म जटिल है, लेकिन यह आमतौर पर "संभव के रूप में कुछ अंतर्निहित रूपांतरण बनाने" के लिए उबालता है।

इस प्रकार, Hello(0) के मामले में, Hello(int) लिए किसी भी रूपांतरण की आवश्यकता नहीं है, लेकिन Hello(double) विधि के लिए एक अंतर्निहित संख्यात्मक रूपांतरण की आवश्यकता है। इस प्रकार, पहली विधि संकलक द्वारा चुनी जाती है।

Hello(0.0) के मामले में, 0.0 को int अंतर में बदलने का कोई तरीका नहीं है, इसलिए Hello(int) को अधिभार संकल्प के लिए भी नहीं माना जाता है। केवल विधि बनी हुई है और इसलिए इसे कंपाइलर द्वारा चुना जाता है।

"परमेस" का विस्तार नहीं किया जाता है, जब तक कि आवश्यक न हो।

निम्नलिखित कार्यक्रम:

class Program
{
    static void Method(params Object[] objects)
    {
        System.Console.WriteLine(objects.Length);
    }   
    static void Method(Object a, Object b)
    {
        System.Console.WriteLine("two");
    }
    static void Main(string[] args)
    {
        object[] objectArray = new object[5];

        Method(objectArray);
        Method(objectArray, objectArray);
        Method(objectArray, objectArray, objectArray);
    }
}

प्रिंट होगा:

5
two
3

कॉल एक्सप्रेशन Method(objectArray) व्याख्या दो तरीकों से की जा सकती है: एक एकल Object तर्क जो एक सरणी के रूप में होता है (इसलिए प्रोग्राम 1 आउटपुट करेगा क्योंकि वह तर्कों की संख्या होगी, या तर्कों की एक सरणी के रूप में, दिया जाएगा। सामान्य रूप, यद्यपि विधि Method में कीवर्ड params । इन स्थितियों में, सामान्य, गैर-विस्तारित रूप हमेशा पूर्वता है। इसलिए, प्रोग्राम 5 आउटपुट करता है।

दूसरी अभिव्यक्ति में, Method(objectArray, objectArray) , पहली विधि का विस्तारित रूप और पारंपरिक दूसरी विधि दोनों लागू हैं। इस मामले में भी, गैर-विस्तारित रूप पूर्वता लेते हैं, इसलिए कार्यक्रम two प्रिंट करता है।

तीसरी अभिव्यक्ति में, Method(objectArray, objectArray, objectArray) , एकमात्र विकल्प पहली विधि के विस्तारित रूप का उपयोग करना है, और इसलिए प्रोग्राम 3 प्रिंट करता है।

अशक्त तर्क के रूप में पासिंग

यदि आपके पास है

void F1(MyType1 x) {
    // do something
}

void F1(MyType2 x) {
    // do something else
}

और किसी कारण से आपको F1 के पहले अधिभार को कॉल करने की आवश्यकता है लेकिन x = null , फिर बस कर

F1(null);

कॉल अस्पष्ट है के रूप में संकलन नहीं करेगा। इसका मुकाबला करने के लिए आप कर सकते हैं

F1(null as MyType1);


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow