2010-07-06 9 views
14

मैं निम्न विधियों में है कहते हैं:कैसे सी # अस्पष्टता के साथ चयन करता है और परम

public static void MyCoolMethod(params object[] allObjects) 
{ 
} 

public static void MyCoolMethod(object oneAlone, params object[] restOfTheObjects) 
{ 
} 

मैं ऐसा करते हैं तो:

MyCoolMethod("Hi", "test"); 

जो एक कहा जाता हो जाता है और क्यों?

+1

ने उल्लेख बेहतर समारोह सदस्य संकल्प के साथ ऐसा करना संभव अंतर्दृष्टि के लिए अपने पिछले प्रश्न देखें हैं: http://stackoverflow.com/questions/2210519/why-does-params-behave -like - – ChaosPandion

+0

तो यह सबसे विशिष्ट का उपयोग करता है, इसका मतलब यह है कि पहली विधि को कभी नहीं कहा जा सकता है? – Vaccano

+1

वहां दिए गए विधि आमंत्रण के साथ, पहली विधि कभी नहीं बुलाई जाएगी। हालांकि, यदि आप 'MyCoolMethod (नई ऑब्जेक्ट [] {"HI", "test"}) का प्रयास करते हैं, तो, पहले को कॉल किया जाएगा, क्योंकि दूसरी विधि के एकल ऑब्जेक्ट पैरामीटर से कोई मिलान नहीं है। – womp

उत्तर

15

परीक्षण करना आसान है - दूसरी विधि कहलाती है।

क्यों - सी # भाषा विनिर्देश के बारे में कुछ सुंदर विस्तृत नियम हैं कि कैसे अस्पष्ट कार्य घोषणाएं हल हो जाती हैं। वहाँ और क्यों अलग भार के बुलाया मिल के कुछ विशिष्ट उदाहरण के साथ भार के एसओ आसपास के इंटरफेस, विरासत पर सवाल के बहुत सारे हैं, लेकिन विशेष रूप से जवाब देने के लिए:

C# Specification - Overload Resolution

7.5.3.2 बेहतर समारोह सदस्य

बेहतर कार्य सदस्य का निर्धारण करने के प्रयोजनों के लिए, एक छीन नीचे तर्क सूची एक ओ में सिर्फ तर्क भाव खुद को युक्त निर्माण किया है rder वे मूल तर्क सूची में दिखाई देते हैं। उम्मीदवार समारोह सदस्यों में से प्रत्येक के लिए

पैरामीटर सूचियों निम्नलिखित तरीके से निर्माण कर रहे हैं:

  • विस्तृत रूप में प्रयोग किया जाता है, तो समारोह सदस्य लागू था केवल विस्तारित रूप में। कोई इसी तर्क के साथ

  • वैकल्पिक पैरामीटर पैरामीटर सूची

  • मापदंडों पुनर्क्रमित कर रहे हैं से निकाल दिए जाते हैं ताकि वे तर्क सूची में इसी तर्क रूप में एक ही स्थिति पर होते हैं।

और आगे पर ...

मामले में पैरामीटर प्रकार दृश्यों {P1, P2, ..., पी एन} और {Q1, Q2, ..., QN} बराबर हैं> (यानी प्रत्येक पीआई के पास संबंधित क्यूई में एक पहचान रूपांतरण होता है), निम्नलिखित बेहतर फ़ंक्शन सदस्य निर्धारित करने के लिए टाई-ब्रेकिंग नियम लागू होते हैं।

  • यदि एमपी एक गैर-सामान्य विधि है और एमक्यू एक सामान्य विधि है, तो एमपी एमक्यू से बेहतर है।

  • अन्यथा, यदि एमपी अपने सामान्य रूप में लागू होता है और एमक्यू में पैराम्स सरणी होती है और केवल अपने विस्तारित रूप में लागू होती है, तो एमपी एमक्यू से बेहतर है।

  • अन्यथा, यदि एमपी ने एमक्यू की तुलना में अधिक पैरामीटर घोषित किए हैं, तो एमपी एमक्यू से बेहतर है। यह तब हो सकता है जब दोनों विधियों में पैरा एरे होते हैं और केवल विस्तारित रूपों में लागू होते हैं।

बोल्ड टाई तोड़ने नियम क्या इस मामले में आवेदन कर रहा है हो रहा है। विनिर्देश इस बात के बारे में विस्तार से बताता है कि परम सरणी को सामान्य और विस्तारित रूपों में कैसे माना जाता है, लेकिन आखिरकार अंगूठे का नियम यह है कि सबसे विशिष्ट ओवरलोड को संख्याओं और पैरामीटर के प्रकार के संदर्भ में बुलाया जाएगा।

+4

एरिक लिपर्ट से उद्धरण: * जब दोनों कॉलों में लागू कॉल दिया जाता है, तो कंपाइलर हमेशा विस्तारित रूप पर सामान्य रूप चुनता है। * – ChaosPandion

+1

+1 एरिक से कुछ भी के लिए। – womp

+0

तो क्या पहली विधि को कॉल करने का कोई तरीका है? – Vaccano

6

दूसरा, कंपाइलर पहले पैराम संग्रह पर वापस आने से पहले स्पष्ट रूप से घोषित पैरामीटर के खिलाफ हल करने का प्रयास करेगा।

1

यह अधिभार मुश्किल है ...

MyCoolMethod ("हाय", "परीक्षण") स्पष्ट रूप से 2 अधिभार कहता है, लेकिन

MyCoolMethod ("हाय"); भी दूसरे अधिभार को कॉल करता है। मैंने इसका परीक्षण किया।

चूंकि दोनों इनपुट ऑब्जेक्ट्स हैं, इसलिए संकलक मानते हैं कि कुछ भी पास हो गया है, ऑब्जेक्ट्स की एक सरणी होगी और पूरी तरह से अधिभार को अनदेखा कर देगा।

यह शायद womp http://msdn.microsoft.com/en-us/library/aa691338(v=VS.71).aspx

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