5

के साथ विधियों के आउटपुट को समझने में सक्षम नहीं है आज मैं सी # के वैकल्पिक पैरामीटर्स के मूलभूत सिद्धांतों को समझने के लिए एक छोटा प्रोग्राम लिख रहा था।वैकल्पिक पैरामीटर

के बाद कार्यक्रम है:

DerivedClass d = new DerivedClass();  
    d.Test(); 
    d.Test(6); 
    d.Test(b:7); 

आउटपुट::

DerivedClass.Test में (int a = 1

abstract class AbstractClass 
{ 
    internal abstract void Test(); 
} 

sealed class DerivedClass : AbstractClass 
{   
    internal override void Test() 
    { 
     Console.WriteLine("In override DerivedClass.Test() method"); 
    } 

    internal void Test(int a = 1) 
    { 
     Console.WriteLine("In DerivedClass.Test(int a=1) method " + a); 
    } 

    internal void Test(int b, int a = 1) 
    { 
     Console.WriteLine("In DerivedClass.Test(int b, int a=1) method " + string.Format("{0} {1}", b, a)); 
    } 
} 

यह मैं कैसे Test() विधि कहा जाता है) विधि 1

DerivedClass.Test में (पूर्णांक एक = 1) विधि 6

DerivedClass.Test में (int ख, पूर्णांक एक = 1) विधि 7 1

d.Test(); के बारे में: यहाँ मेरी समझ यह है कि यह होगा Test() एक वैकल्पिक पैरामीटर के साथ विधि के रूप में लेते हैं और इस उत्पादन के साथ Test(int a = 1) लागू करेगा:

DerivedClass.Test में (पूर्णांक एक = 1) विधि 1

0,123,

लेकिन यह क्या मुझे confuses जब d.Test(6); क्रियान्वित है: क्यों इस विधि कॉल के रूप में उत्पादन न जताए:

DerivedClass.Test में (int ख, पूर्णांक एक = 1) विधि 6 1

मेरी समझ "6" के अनुसार अनिवार्य पैरामीटर है और यह आह्वान चाहिए

internal void Test(int b, int a = 1) 

कृपया समझाने क्या मेरी समझ के साथ गलत है।

इसके अलावा ओवरडिन विधि को कैसे कॉल करें?

internal override void Test() 
+3

'टेस्ट (6) 'टेस्ट क्यों शुरू किया जाना चाहिए (int b, int a = 1)'? पहले से ही एक मिलान विधि 'टेस्ट (int a = 1) 'है, जिसे' ए' सेट 'से' 6' के साथ बुलाया जाता है। –

+0

कृपया देखें ["प्रश्नों में उनके शीर्षक में" टैग "शामिल होना चाहिए?"] (Http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles), जहां सर्वसम्मति "नहीं, उन्हें नहीं करना चाहिए"! –

+1

@Dennis_E लेकिन पहले टेस्ट में 'टेस्ट (int a = 1)' क्यों कहा जाता है जब किसी भी पैरा के बिना बेहतर मिलान होता है? – HimBromBeere

उत्तर

0

वैकल्पिक पैरामीटर से संबंधित नियमों के एक छोटे से भ्रामक हो सकते हैं, लेकिन अंगूठे को याद करने का एक सरल नियम है कि यह हमेशा अधिक के साथ एक वरीयता में कम मानकों के साथ एक विधि का उपयोग करेंगे।

तो के लिए

d.Test(6); 

सिर्फ एक पैरामीटर के साथ विधि:

internal void Test(int a = 1) 

इस्तेमाल किया जाएगा, भले ही यह एक वैकल्पिक पैरामीटर है।

+1

क्या आप इससे संबंधित कुछ दस्तावेज़ प्रदान कर सकते हैं? नामांकित और वैकल्पिक तर्कों पर एमएसडीएन पृष्ठ मुझे बहुत स्पष्ट नहीं लगता है। –

6

internal void Test(int a = 1) के लिए नियम मिलान आपके कोड d.Test(6); से मेल खाता है: यह तर्कों, प्रकारों की संख्या से मेल खाता है। यह विधि को सबसे अच्छा मैच बनाता है।

d.Test(b:7); पर कॉल करते समय, आप इसे अंतिम विधि के रूप में चलाने के लिए मजबूर करते हैं, क्योंकि आप पैरामीटर के नाम से मेल खाते हैं।इससे आखिरी विधि सबसे अच्छी मेल खाती है।

पहला (d.Test();) आपके द्वारा अपेक्षित विधि (void Test()) से मेल नहीं खाता है, क्योंकि 'स्वयं' विधियों को व्युत्पन्न विधियों पर प्राथमिकता दी जाती है। बेस क्लास को निकालने का प्रयास करें या विधि पर new ऑपरेटर का उपयोग करें और आप देखेंगे।

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