2012-10-05 11 views
6

मैं जब लिस्टिंग 3.4 जॉन स्कीट की पुस्तक, सी गहराई में # से tweak करने की कोशिश कर निम्न त्रुटि संदेश मिल रहा है ...कार्यान्वयन IComparable <T>

प्रकार 'list_3_4.Dog' प्रकार पैरामीटर के रूप में नहीं किया जा सकता ' टी 'सामान्य प्रकार या विधि' list_3_4.Program.CompareToDefault (टी) 'में। 'list_3_4.Dog' से 'System.IComparable' तक कोई अंतर्निहित संदर्भ रूपांतरण नहीं है।

यहाँ मेरी कोड है ...

using System; 

namespace list_3_4 
{ 
    class Program 
    { 
      static void Main(string[] args) 
      { 
       //string mystring; 
       Dog d = new Dog("howie"); 

       Console.WriteLine(CompareToDefault("x")); 
       Console.WriteLine(CompareToDefault(10)); 
       Console.WriteLine(CompareToDefault(0)); 
       Console.WriteLine(CompareToDefault(-10));    
       Console.WriteLine(CompareToDefault(DateTime.MinValue)); 

       Console.WriteLine(CompareToDefault(d)); 

       Console.ReadKey(); 
      } 

      static int CompareToDefault<T> (T value) where T: IComparable<T> 
      { 
       return value.CompareTo(default(T));    
      } 

    } 

    public class Dog 
    { 
      private string _name; 

      public Dog(string name) 
      { 
       _name = name; 
      } 
     } 
} 

मैं कैसे जॉन Skeets कोड लिस्टिंग के साथ काम करने के लिए एक "डॉग" की तरह एक संदर्भ प्रकार जोड़ सकता हूँ ??? मैं समझता हूं कि कुत्ते को IComparable लागू करने की जरूरत है, लेकिन मुझे नहीं पता कि कैसे!

+1

प्रश्न क्या है? – elyashiv

+1

आपकी 'कुत्ते' कक्षा सामान्य बाधा द्वारा निर्दिष्ट 'IComparable ' लागू करने के लिए प्रतीत नहीं होती है, जहां टी: आईसीओम्पेरबल '। –

+1

+1 कोड कोड के लिए जो मैं कॉपी, पेस्ट और प्ले कर सकता हूं। हालांकि एक सवाल अच्छा लॉल –

उत्तर

12

आप एक प्रकार T है कि जरूरत है कह कर पद्धतियां निर्धारित एक IComparable<T>:

where T: IComparable<T> 

लेकिन Dog को लागू नहीं करता है IComparable<Dog>

आप क्या करने की जरूरत:

public class Dog : IComparable<Dog> 
{ 
//this will allow you to do a quick name comparison 
public string Name { get; set;} 
public int CompareTo(Dog other) 
{//compare dogs by name 
     return this._name.CompareTo(other.Name); 
} 
} 

नोट: default(T) संदर्भ प्रकारों के लिए शून्य लौटाएगा, इसलिए आपको कहीं नल की जांच करनी चाहिए। default on msdn के बारे में पढ़ें।

+2

@ डेमेट्रियस आप जिस अंतिम कार्यान्वयन पर निर्णय लेते हैं उसे '_name' और' अन्य' और 'अन्य' नाम पर शून्य जांच करनी चाहिए। –

+0

आपको वास्तव में 'नाम' संपत्ति की आवश्यकता नहीं है। यदि आप इसे जोड़ते हैं तो आपको कम से कम सेटर को भी निजी बनाना चाहिए। – Servy

+0

@AdamHouldsworth या आप केवल स्थिर 'string.compare' का उपयोग कर सकते हैं जो आपके लिए शून्य जांच करता है। – Servy

8

आपकी Dog कक्षा को IComparable<T> लागू करना चाहिए।

public class Dog: IComparable<Dog> 
{ 
     private string _name; 

     public Dog(string name) 
     { 
      _name = name; 
     } 

     public int CompareTo(Dog other) 
     { 
      if (other == null) 
       return 1; 
      return string.Compare(_name, other._name); 
     } 
} 
+0

पब्लिक क्लास डॉग: आईसीओपरपेरबल काम नहीं कर रहा है, केवल सार्वजनिक वर्ग कुत्ता: आईसीओपरपेरबल काम कर रहा है ... तरह ... अब मुझे एक NullReferenceException मिल रहा है ??? – dannyrosalex

+0

@ डेमेट्रियस बर्लियोज़ मैंने 'अन्य == नल' के लिए एक चेक जोड़ा है, इसे अभी काम करना चाहिए। – Alex

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