2012-10-05 102 views
6

我正在試圖調整清單3.4從喬恩斯基特的書,C#中的深度,當出現以下錯誤信息......實現IComparable的<T>

類型「list_3_4.Dog」不能用作類型參數「 T'泛型類型或方法'list_3_4.Program.CompareToDefault(T)'。 沒有從'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; 
      } 
     } 
} 

如何添加引用類型像「狗」與Jon長柄水杓代碼清單工作???我知道狗需要實現IComparable,但我不知道如何!

+1

有什麼問題嗎? – elyashiv

+1

你'Dog'類似乎並沒有實現IComparable接口'',由通用約束'其中T規定: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

@Demetrius您決定在最後的實現應該做'_name'和'other'和'other.Name'空檢查。 –

+0

你實際上並不需要'Name'屬性。如果你添加它,你至少應該讓setter也是私人的。 – 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

公共類Dog:IComparable 不工作,只有公共類Dog:IComparable 正在工作...有點...現在我得到一個NullReferenceException? – dannyrosalex

+0

@DemetriusBerlioz我添加了一個'other == null'的檢查,它現在應該可以工作。 – Alex

相關問題