2012-01-13 15 views
12

मान लीजिए मैं इन दो ctors है:कॉल निम्न विधियों या गुणों के बीच अस्पष्ट है

public SomeClass(string a, Color? c = null, Font d = null) 
     { 
      // ... 
     } 

public SomeClass(string a, Font c = null, Color? d = null) 
     { 
      // ... 
     } 

~ और मैं यह कर: "त्रुटि 1 The:

SomeClass sc = new SomeClass("Lorem ipsum"); 

मैं इस मिल जाएगा कॉल निम्न विधियों या गुणों के बीच संदिग्ध है [...] "

ऐसा लगता है कि इससे कोई फर्क नहीं पड़ता कि मुझे अंतिम परिणाम के रूप में संदर्भित किया गया है (कम से कम इस विशेष मामले में, और मेरे लिए यह सब टी है टोपी अभी मायने रखती है), तो इस के आसपास होने के मेरे विकल्प क्या हैं?

संपादित करें 1: @oltman: सरलीकृत उदाहरण।

SomeClass sc = new SomeClass("Lorem ipsum", (Color?)null, (Font)null); 
+3

वहाँ एक कारण है कि आप दोनों है, या यह सिर्फ एक सरल उदाहरण है? – oltman

उत्तर

21

दोनों निर्माताओं की एक ही नंबर ले:

मैं सिर्फ

[...] new SomeClass("Lorem", Color.Green) 

बजाय

[...] new SomeClass("Lorem", null, Color.Green) 
+0

यह काम अद्भुत काम करता है और ठीक वही है जो मैं ढूंढ रहा था। –

7

एक तरह से यह काम करने के लिए मजबूर करने के लिए लिखने के लिए सक्षम होना चाहते हैं तर्क, लेकिन एक अलग क्रम में। चूंकि आपने दो कन्स्ट्रक्टर पैरामीटर के लिए डिफ़ॉल्ट मान निर्दिष्ट किए हैं, इसलिए दूसरा तर्क प्रदान नहीं होने पर संकलक दो अधिभारों के बीच अंतर नहीं कर सकता है।

मैं तुम्हें मौजूदा कंस्ट्रक्टर्स को हटा दें और निम्नलिखित के साथ बदलने के लिए सलाह देंगे:

public SomeClass(string a, Color? color, Font font) 
{ 
    // constructor implementation 
} 

public SomeClass(string a) : this(a, null, null) {} 
public SomeClass(string a, Color color) : this(a, color, null) {} 
public SomeClass(string a, Font font) : this(a, null, font) {} 
+0

यह बहुत उपयोगी है जब आपके पास केवल एक तर्क है – Eli

1

आप एक और निर्माता कि सिर्फ स्ट्रिंग लेता है बना सकते हैं, और अपने दूसरे मानकों को अनिवार्य बनाने के लिए ऊपर कंस्ट्रक्टर्स अद्यतन?

विचार है कि आप हमेशा स्ट्रिंग की आपूर्ति और उसके बाद वैकल्पिक रूप से रंग या फ़ॉन्ट या दोनों की आपूर्ति, इस तरीके के बारे में द्वारा वस्तु का निर्माण कर सकते हैं: "त्रुटि:

public SomeClass(string a) 
     { 
      // ... 
     } 

public SomeClass(string a, Color? c) 
     { 
      // ... 
     } 

public SomeClass(string a, Font f, Color? d = null) 
     { 
      // ... 
     } 
0

मैं इस मिल जाएगा 1 कॉल निम्न विधियों या गुणों के बीच अस्पष्ट है [...] "

यह स्पष्ट मुझे लगता है कि यह कोई फर्क नहीं पड़ता जो एक मैं करने के लिए अंतिम परिणाम के रूप में ही

है उल्लेख

कॉल संदिग्ध है। प्रत्येक कन्स्ट्रक्टर अद्वितीय है - इससे कोई फर्क नहीं पड़ता कि वे दोनों एक उदाहरण बनाते हैं और वापस करते हैं, क्योंकि प्रत्येक कन्स्ट्रक्टर में अलग-अलग तर्क हो सकते हैं। कंपाइलर अभी भी नहीं जानता कि आपका कौन सा कन्स्ट्रक्टर है।

0

यह anti-pattern का एक आदर्श उदाहरण है, इस से बचने का सबसे अच्छा तरीका @ फिल क्लेन का जवाब है।

यहाँ अशक्त के रूप में वर्ग पारित करने के लिए एक और वाक्य रचना है:

SomeClass sc = new SomeClass("Lorem ipsum", null as Color, null as Font); 
संबंधित मुद्दे