2010-03-31 18 views
7

पर बाइनरी तुलना ऑपरेटर मेरे पास एक सामान्य वर्ग है जो T टाइप करता है।सामान्य प्रकार

public class MyClass<T> 
{ 
    public T MaxValue 
    { 
     // Implimentation for MaxValue 
    } 

    public T MyMethod(T argument) 
    { 
     if(argument > this.MaxValue) 
     { 
      // Then do something 
     } 
    } 
} 

तुलना आपरेशन MyMethod के अंदर कंपाइलर त्रुटि CS0019 के साथ विफल: इस वर्ग के भीतर मैं एक विधि थे मैं जैसे एक और प्रकार T करने के लिए एक प्रकार T तुलना करने की आवश्यकता है। क्या यह काम करने के लिए T पर बाधा जोड़ना संभव है? मैंने where T: IComparable<T> को क्लास परिभाषा में कोई फायदा नहीं हुआ।

+0

यह असंभव = (हालांकि। एक ओपन सोर्स गणित लाइब्रेरी है जो इसके साथ निपटने का प्रयास करती है, नाम को याद रखना होगा ... – vittore

उत्तर

9

सुनिश्चित करें कि प्रकार लागू करता IComparable<T> बनाने के लिए बाधा को जोड़ने से जाने के लिए एक तरीका है। हालांकि, अगर आप < ऑपरेटर का उपयोग नहीं कर सकते हैं - इंटरफेस एक तरीका प्रदान करता है CompareTo एक ही बात करने के लिए:

public class MyClass<T> where T : IComparable<T> { 
    public T MaxValue { 
     // Implimentation for MaxValue 
    } 

    public T MyMethod(T argument) { 
     if(argument.CompareTo(this.MaxValue) > 0){ 
      // Then do something 
     } 
    } 
} 

तुम सिर्फ तुलना के अलावा अन्य संख्यात्मक ऑपरेटरों की जरूरत है, तो स्थिति, और अधिक कठिन है क्योंकि आप के लिए बाधा नहीं जोड़ सकते उदाहरण के लिए समर्थन + ऑपरेटर और कोई संबंधित इंटरफ़ेस नहीं है। इस can be found here के बारे में कुछ विचार।

+0

मुझे इसे मारो। :) –

+0

अच्छी कॉल टॉमस। मैंने यह प्रश्न पूछने के तुरंत बाद इस सटीक मुद्दे के बारे में http://blogs.telerik.com/hristoborisov/posts/09-01-10/comparing_generic_types.aspx पर एक ब्लॉग पोस्ट पाया जो पुष्टि करता है कि आप क्या कह रहे हैं। –

3

नहीं, यह संभव नहीं है, ऑपरेटर बाधाओं को दुर्भाग्य से सी # में अनुमति नहीं है। where T: IComparable<T> ठीक काम करना चाहिए, लेकिन आप अन्य अर्थ विज्ञान का उपयोग करने के: के बजाय compareTo विधि>, < और == ऑपरेटरों।

+0

हाँ और मुझे यकीन नहीं है कि ओपी के लिए ऑपरेटरों के उपयोग से विवाह हो । –

+0

Hmm..I वास्तव में अपनी टिप्पणी समझा नहीं। – n535

+0

वह मतलब है कि ओपी उन ऑपरेटरों का उपयोग करने के लिए बाध्य नहीं है। उन्होंने कहा कि किसी अन्य तरीके से उपयोग कर सकते हैं, als तक यह काम करता है, ठीक है। –

2

आप IComparable<T> के CompareTo विधि का उपयोग करने के लिए है।

1

असल में, आप यहाँ कुछ भी विशेष जरूरत नहीं है। Comparer<T>.Default एक .Compare विधि प्रदान करता है जो आपको बिना किसी अतिरिक्त जेनेरिक बाधाओं (जो भयंकर रूप से प्रसारित करता है) की आवश्यकता के बिना आवश्यक सब कुछ करेगा। यह IComparable<T> और IComparable दोनों के लिए काम करता है, और कक्षाओं, structs और Nullable<T> का समर्थन करता है। काम हो गया।

जानकारी के लिए, इस प्रकार LINQ Max/Min कार्यान्वयन कार्य करता है, और इसी तरह List<T>.Sort। तो बीसीएल का एक आम और अच्छी तरह से समर्थित हिस्सा।

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