12

ओवरलोड मैं दो विस्तार के तरीकों है: केवल अगर मैं स्पष्ट रूप से IEnumerable प्रकार निर्दिष्टएक्सटेंशन तरीकों पसंद

List<Customer> collection2 = new List<Customer>(); 
collection2.ShouldHave(); //first overload is chosen 
IEnumerable<Customer> collection3 = new List<Customer>(); 
collection3.ShouldHave(); //second overload is chosen 

दूसरा अधिभार चुना जाता है:

public static IPropertyAssertions<T> ShouldHave<T>(this T subject) 
{ 
    return new PropertyAssertions<T>(subject); 
} 

public static IPropertyAssertions<T> ShouldHave<T>(this IEnumerable<T> subject) 
{ 
    return new CollectionPropertyAssertions<T>(subject); 
} 

अब मैं कुछ कोड है जो इसे इस्तेमाल करता है लिखते हैं। क्या दोनों मामलों में दूसरे अधिभार को चुनने का कोई तरीका है?

+0

'संग्रह 1' और' संग्रह 2' के बीच कोई अंतर नहीं होगा। वे बिल्कुल वही कोड हैं, केवल अलग-अलग लिखे गए हैं। – svick

+0

@svick, हाँ, लेकिन मैं सभी वाक्यविन्यास विकल्पों को दिखाना चाहता था – SiberianGuy

+3

ध्यान दें कि तथ्य यह एक विस्तार विधि है अप्रासंगिक है; अधिभार संकल्प इसे एक सामान्य स्थैतिक विधि की तरह संभालता है। –

उत्तर

5

ऐसा मत सोचो। ऐसा नहीं लगता कि यह संभव है कि में यह केस IEnumerable<T> ओवरलोड हमेशा कहा जाएगा, क्योंकि कमT प्रकार के संबंध में सटीक मिलान है। यदि आप एक ठोस IEnumerable<T> निर्दिष्ट नहीं करते हैं, तो सबसे अच्छा मिलान हमेशा में मामले में पहला तरीका होगा।

7

पहला अधिभार एक बेहतर मैच है, क्योंकि टी को List<Customer> के रूप में अनुमानित किया गया है, जो सटीक मिलान देता है। दूसरे अधिभार के लिए, यह टी को Customer के रूप में अनुमानित करेगा, इसलिए पैरामीटर IEnumerable<Customer> होगा, जो List<Customer> से कम सटीक मिलान है।

1

कंधेव() का दोहरा अर्थ है। पहले मामले में, चाहिएहेव() को विषय-पैरामीटर द्वारा प्रदान की गई वस्तु के बारे में एक वापसी है। दूसरे मामले में, वापसी गणना में वस्तुओं के बारे में है, न कि गणना के बारे में।

यदि मैं अपना स्वयं का संग्रह बना देता हूं और मैं इस संग्रह को स्वयं (आइटम नहीं) का परीक्षण करना चाहता हूं, तो मुझे निश्चित रूप से कंधेव (यह टी विषय) कहा जाना चाहिए और नहीं चाहिए (यह IENumerable विषय)।

शायद आपको अपने डिज़ाइन पर पुनर्विचार करना चाहिए। दूसरा कंधे() दो चीजें करता है, इसलिए इसे एक विधि में विभाजित किया जाना चाहिए जो संग्रह-वस्तुओं को निकालता है और पहले कंधे() को कॉल करता है, जो आपके पास पहले से है।

+0

के साथ पहला मामला हटाया गया है वही है जो हम कोशिश कर रहे हैं करने के लिए, लेकिन हमें सी # कंपाइलर के ओवरलोड रिज़ॉल्यूशन के साथ कुछ परेशानी हैं। –

+0

सी # कंपाइलर सही है कि यह एक मैच पर एकदम सही मैच पसंद करता है जिसे पहले टाइपकास्ट की आवश्यकता होती है। मुझे लगता है कि आपका डिजाइन अपूर्ण है और आप इसे सी # कंपाइलर द्वारा अपूर्ण होने के साथ हल करना चाहते हैं। यदि मैं वास्तव में अपने संग्रह में कंधेव (यह टी विषय) लागू करना चाहता हूं तो क्या होगा? आप इस परिदृश्य को अवरुद्ध क्यों करना चाहते हैं? –

+0

मुझे अपूर्ण होना पसंद है :-) –

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