5

मूल रूप से ठीक करने के लिए मैं निम्नलिखित है नहीं कर रहा हूँ:जेनेरिक की कमी मुझे यकीन है कि कैसे या तो एक के साथ इस स्थिति/या मामले

public static bool IsBetween<T>(this T value, T a, T b) 
    where T : IComparable 
{ 
    ... 
} 

public static bool IsBetween<T>(this T value, T a, T b) 
    where T : IComparable<T> 
{ 
    ... 
} 

समस्या मैं ऐसा नहीं कर सकते है, क्योंकि आप नहीं कर सकते एक ही हस्ताक्षर के साथ एक सदस्य है, भले ही बाधाएं अलग हों। लेकिन, यह बताने का कोई तरीका नहीं है कि बाधा IComparable या IComparable<T> है। तो, मुझे यकीन नहीं है कि सिर्फ एक को चुनने और इसके साथ जाने के बाहर क्या करना है। और, कोई फर्क नहीं पड़ता कि मैं कौन सा चुनता हूं, मैं दूसरे पर हार रहा हूं क्योंकि वे अलग हैं और एक दूसरे से विरासत में नहीं हैं (जो समझ में आता है)।

क्या मुझे यहां कुछ याद आ रहा है, क्या दोनों का उपयोग करने के लिए एक तरीका है, या क्या मुझे एक (शायद सामान्य संस्करण) चुनना है?

उत्तर

8

मुझे समझ में नहीं आता कि पहली विधि सामान्य क्यों है। यह क्यों नहीं है:

public static bool IsBetween(this IComparable value, IComparable left, IComparable right) 

विधि जेनेरिक जोड़ने का क्या मूल्य है? जाहिर है कि आप मुक्केबाजी दंड से बचने वाले नहीं हैं क्योंकि जब आप CompareTo(object) पर कॉल करते हैं तो मूल्यों को बॉक्स किया जा रहा है।

जब तक आपके पास विधि सामान्य बनाने के लिए कुछ अनिवार्य कारण नहीं है, तो इसे सामान्य बनाएं। इसके बाद दूसरी विधि से एक अलग हस्ताक्षर है, और आपकी समस्या हल हो गई है।

+0

मैंने कभी इस तरह के बारे में कभी सोचा नहीं। मुझे लगता है कि ऐसा इसलिए था क्योंकि मैंने सामान्य संस्करण के साथ शुरुआत की, फिर इसे कॉपी/पेस्ट किया और बस एक त्वरित परिवर्तन करने का प्रयास किया। –

+0

इसके अलावा, यह डिफ़ॉल्ट रूप से 'IComparable 'विकल्प का चयन करने के लिए डिफ़ॉल्ट होगा, और' IComparable' विकल्प दूसरा होगा? –

+1

@ एम-वाई: ओवरलोड रिज़ॉल्यूशन * अधिक विशिष्ट * विधि का चयन करेगा। यदि यह निर्धारित करने का कोई तरीका नहीं है कि कौन सा अधिक विशिष्ट है तो आपको अस्पष्टता त्रुटि मिल जाएगी। –

3

.NET विधि रिज़ॉल्यूशन ओवरलोड में खाता प्रकार और सामान्य बाधाओं को ध्यान में नहीं रखा जाता है। तो अगर IComparable और IComparable<T> में कुछ ऐसा आम था जो अभी भी काम नहीं करेगा। बस IComparable<T> संस्करण चुनें। मानक .NET प्रकार जैसे Int32, दशमलव, दिनांक समय, ... दोनों इंटरफेस को लागू करें।

+0

यही मुझे लगा, लेकिन मैं यह सुनिश्चित करना चाहता था कि मैं यहां कुछ याद नहीं कर रहा था। मैं जेनेरिक संस्करण के साथ जा रहा हूँ। मैं बस उम्मीद कर रहा था कि मेरी विधि अन्य कोड के लिए उपलब्ध हो जो केवल 'आईसीओपरपेबल' लागू करती है और दोनों नहीं (या केवल 'आईसीओम्पेरबल ')। –

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