2010-06-26 16 views
11

निम्नलिखित कोड में संकलित सी # 4.0:कमोबेश बराबर भार के

void Foo(params string[] parameters) { } 
void Foo(string firstParameter, params string[] parameters) { } 

संकलक कैसे जान लेता है कि जो आप कॉल कर रहे अधिभार? और यदि यह नहीं हो सकता है, तो कोड अभी भी संकलित क्यों करता है?

+7

+1, दिलचस्प सवाल, हालांकि यह शायद चश्मे में पहले से ही उत्तर दिया गया है। –

उत्तर

13

यह अच्छी तरह से सी # भाषा विशिष्टता में निर्दिष्ट किया जाता, अध्याय 7.4.3.2, "बेटर समारोह सदस्य":

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

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

Fwiw, सी # भाषा विशिष्टता बहुत पठनीय दस्तावेज़ है और आप इन पहेली को स्वयं से हल करने में आपकी सहायता कर सकते हैं। आपके पास यह आपकी मशीन पर है, इसे वीसी # \ विनिर्देशों \ 1033 उपनिर्देशिका में विजुअल स्टूडियो इंस्टॉल निर्देशिका (जैसे सी: \ प्रोग्राम फाइल \ माइक्रोसॉफ्ट विजुअल स्टूडियो 9.0) में वापस ढूंढें।

एक और अच्छा एक्मा -335 मानक दस्तावेज़ है, जो PDF download के रूप में स्वतंत्र रूप से उपलब्ध है। यह सीएलआर और जेआईटी कंपाइलर के व्यवहार को निर्दिष्ट करता है, यह समझने के लिए महान सामग्री क्यों सी # (और सीएलआर) वे करते हैं जो वे करते हैं। सिफारिश की।

+1

दिलचस्प। यदि मैं ओपी कोड लेता हूं और 'Foo ("one") को कॉल करता हूं, तो कंपाइलर दूसरी विधि (vs2010, .net 4) का चयन करता है, जो उस उद्धरण के अनुसार गलत लगता है। एकमात्र तरीका जिसे मैंने पहली विधि का आह्वान किया था, एक स्ट्रिंग सरणी को एकमात्र तर्क के रूप में पास करना था। –

+0

@ फ़्रेड्रिक: मेरी गलती, एक नियम चूक गया। –

+0

अब यह अधिक समझ में आता है :) –

6

कुछ मामलों में, it will decide for you। इसलिए, आप इस तरह के मामलों में अलग-अलग नामों का उपयोग करना चाहेंगे (या अधिक उपयोगी मामलों में :-))।

विशेष रूप से, चार मामलों में से:

 Foo("bar"); 
     Foo("bar", "bar"); 
     Foo(new string[]{"bar", "bar"}); 
     Foo("bar", new string[] { "bar", "bar" }); 

केवल # 1 और # 2 हैं 'अस्पष्ट' (के बाद से # 3 और # 4 स्वाभाविक रूप से क्रमश: अधिभार 1 और 2 से मेल खाते हैं)।

मामलों में # 1 और # 2 ओवरलोड रिज़ॉल्यूशन ओवरलोड # 2 चुनता है, क्योंकि इसमें एक स्टैंडअलोन स्ट्रिंग पैरामीटर है जो आमंत्रण के केवल/पहले पैरामीटर से मेल खाता है।

+0

वह वास्तव में समझ में आता है। – user230821

+0

ओह हाँ, यह समझ में आता है। मेरा मतलब था कि ऐसे 2 ओवरलोड होने के लिए बहुत उपयोगी नहीं है। – Mau

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