泛型和实现IC Comparable

时间:2012-02-01 10:26:06

标签: c# .net generics icomparable

我对泛型非常新,我正在尝试编写一个简单的类,它将是通用的,但也允许对字符串成员变量进行一些描述的排序。

目前我有一个基本类但是当我尝试实现接口成员CompareTo()时,我在顶部收到一个错误,告诉我它没有实现。这是什么问题?

using System;

namespace GenericsPracticeConsole.Types
{
    class SortableGenericType<T> : IComparable
    {
        private T t;
        private string stringName;

        public T name
        {
            get { return t; }
            set { t = value; }
        }

        public int CompareTo(SortableGenericType<T> ourObject)
        {
            return stringName.CompareTo(ourObject.stringName);
        }
    }
}

2 个答案:

答案 0 :(得分:7)

有两个接口IComparableIComparable<U>IComparable是较旧的(在泛型之前出现),它要求将实例与任意对象进行比较。 IComparable<U>要求将实例与U的实例进行比较。如果您要声明将比较stringName字段上的SortableGenericType实例,那么您应该这样做:

class SortableGenericType<T> : IComparable<SortableGenericType<T>>
{
   //
}

如果您还想实施IComparable:

   class SortableGenericType<T> : IComparable, IComparable<SortableGenericType<T>> 
   {
      private string stringName;
      public T name { get; set; }

      public int CompareTo(SortableGenericType<T> ourObject)
      {
         //I forgot to add this statement:
         if(ourObject == null) 
             return -1; 
         return stringName.CompareTo(ourObject.stringName);
      }

      public int CompareTo(object obj)
      {
         if (obj.GetType() != GetType())
            return -1;
         return CompareTo(obj as SortableGenericType<T>);
      }
   }

如果您的类是一个集合,其中包含T类型的项目,并且您需要这些项目是可订购的(这不是您要求的,但这是最常见的情况),而不是您需要的{ {1}}为T

IComparable<T>

答案 1 :(得分:5)

IComparable定义方法public int CompareTo(object obj)。请注意参数类型 - 它是object,而不是您自己的类型。这就是你实际上没有实现界面的原因。

您需要做的是实施IComparable<SortableGenericType<T>>