2009-07-31 7 views
6

मैंने अपनी पुस्तक के जॉन स्कीट के प्रारंभिक पहुंच संस्करण को पढ़ना शुरू कर दिया है, जिसमें सी # 4.0 पर अनुभाग शामिल हैं, और एक चीज ने मुझे मारा। दुर्भाग्य से मेरे पास विजुअल स्टूडियो 2010 उपलब्ध नहीं है इसलिए मैंने सोचा कि मैं इसके बजाय यहां पूछूंगा और देख सकता हूं कि किसी को जवाब पता था या नहीं।क्या सी # 4.0 और वैकल्पिक पैरामीटर और ओवरलोड का संयोजन आपको अस्पष्टता के बारे में चेतावनी देता है?

अगर मैं निम्नलिखित कोड, मौजूदा कोड का एक मिश्रण है, और नए कोड है:

public void SomeMethod(Int32 x, Int32 y) { ... } 

public void SomeMethod(Int32 x, Int32 y, Int32 z = 0) { ... } 

संकलक परिभाषा साइट या संभव अस्पष्टता के बारे में कॉल स्थल पर या तो शिकायत करेगा?

उदाहरण के लिए, कोड का यह टुकड़ा वास्तव में क्या करेगा?

SomeClass sc = new SomeClass(); 
sc.SomeMethod(15, 23); 

क्या यह संकलित होगा? क्या यह जेड पैरामीटर के बिना एक को कॉल करेगा, या यह जेड पैरामीटर के साथ एक को कॉल करेगा?

+0

एक तरफ इस विशिष्ट प्रश्न छोड़कर, मुझे नए अध्यायों पर कोई अन्य प्रतिक्रिया प्राप्त करने में बहुत खुशी होगी - या तो समान प्रश्नों के माध्यम से या सीधे ईमेल ([email protected]) के माध्यम से।आशा है कि आप नई चीजें का आनंद लें :) –

+0

मैं किसी भी प्रतिक्रिया या प्रश्न भेजने से पहले डाउनलोड की गई फ़ाइल को पढ़ रहा हूं;) लेकिन हाँ, मुझे फीडबैक प्रदान करने में खुशी होगी। मैं सप्ताहांत में इंटरनेट के बिना फाइल को मेरे साथ घर में ला रहा हूं, इसलिए शायद मैं इसमें जा रहा हूं। –

उत्तर

6

यह चेतावनियों के बिना संकलित करेगा और पहले अधिभार का चयन करेगा।

वैकल्पिक और नामित पैरामीटर की शुरूआत के साथ, सी # का ओवरलोड रिज़ॉल्यूशन तंत्र वास्तव में जटिल हो गया है। इस विशिष्ट मामले में, हालांकि यह समझ में आता है। हमेशा की तरह, कंपाइलर सबसे विशिष्ट ओवरलोड का चयन करेगा जो तर्कों से मेल खाता है।

मेरा मानना ​​है कि नहीं इस विशेष मामले के सी # 1.0 से बहुत अलग है:

public void SomeMethod(Int32 x, Int32 y) { } 
public void SomeMethod(Int32 x, Int32 y, params Int32[] z) { } 

जो हूबहू काम करता है (अधिभार संकल्प के संदर्भ में)।

उत्तर का पालन करें: मुझे ऐसा नहीं लगता है। मुझे डर है कि आपको विधि कॉल में मैन्युअल रूप से डिफ़ॉल्ट तर्क निर्दिष्ट करना होगा।

public void SomeMethod(Int32 x, Int32 y) { } 
public void SomeMethod(Int32 t, Int32 y, Int32 z = 0) { } 

आप के साथ दूसरे अधिभार चुन सकते हैं:

obj.SomeMethod(t: 10, y: 20); 
+1

फॉलो-अप प्रश्न: क्या 'z' पैरामीटर निर्दिष्ट किए बिना दूसरा अधिभार कॉल करने का कोई तरीका है? – Blixt

9

यह अध्याय की "अधिभार संकल्प" खंड में कवर किया जाता है हालांकि, अगर x या y पैरामीटर की तरह एक अलग नाम था।

जब कंपाइलर के पास दो अन्यथा-बराबर विकल्प चुनने के लिए विकल्प होते हैं, तो यह एक अधिभार का उपयोग करेगा जिसे किसी भी अनुचित वैकल्पिक पैरामीटर को प्राथमिकता में उपयोग करने की आवश्यकता नहीं होती है, लेकिन यह सख्त बाइनरी पसंद है। यदि इसे एक अपरिपक्व वैकल्पिक पैरामीटर और दो के साथ अधिभार के बीच चयन करना है, तो यह एक अस्पष्ट स्थिति माना जाएगा।

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

// Both invalid 
sc.SomeMethod(15, 23,); 
sc.SomeMethod(15, 23, z:) 

, आप यह तो कर सकता है:: आप उदाहरण के लिए इनमें से किसी का उपयोग नहीं कर सकते,

public void SomeMethod(Int32 x, Int32 y) { ... } 
public void SomeMethod(Int32 a, Int32 b, Int32 c = 0) { ... } 

sc.SomeMethod(a: 15, b: 23); // Calls second method 
+0

बैंडविगन कूदने के लिए मुझे सही काम करता है :) –

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