实现IComparable <t> </t>

时间:2012-10-05 14:16:36

标签: c# generics

在尝试从Jon Skeet的书中深入调整清单3.4时,我收到以下错误消息......

  

类型'list_3_4.Dog'不能用作泛型类型或方法'list_3_4.Program.CompareToDefault(T)'中的类型参数'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 Skeets代码列表???我知道Dog需要实现IComparable但我不知道怎么做!

2 个答案:

答案 0 :(得分: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)会为参考类型返回 null ,因此您应该在某处进行空检查。阅读default on msdn

答案 1 :(得分:9)

您的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 );
      }
 }