6

我在尝试调整 Jon Skeet 的书 C# 中的清单 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 但我不知道怎么做!

4

2 回答 2

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,因此您应该在某处进行 null 检查。阅读msdn 上的默认值

于 2012-10-05T14:19:01.860 回答
10

你的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 );
      }
 }
于 2012-10-05T14:20:20.800 回答