C# 泛型和IComparable-错误CS00301

C# 泛型和IComparable-错误CS00301,c#,.net,generics,icomparable,C#,.net,Generics,Icomparable,我试图开发一个实现IComparable的泛型类“MinHeap(T)”。当泛型为“int”或另一个类为“Code”时,它可以正常工作。更进一步,为T使用泛型类“节点(代码)” 导致下面提到的错误 我可能太新了,不理解IComparable和IComparable(T)之间的细微差别。有人有主意吗? 提前感谢您的帮助, LJ 错误消息: 错误2类型“Algorithms.Node(Algorithms.Code)”不能用作泛型类型或方法“Algorithms.MinHeap(T)”中的类型参数“

我试图开发一个实现IComparable的泛型类“MinHeap(T)”。当泛型为“int”或另一个类为“Code”时,它可以正常工作。更进一步,为T使用泛型类“节点(代码)” 导致下面提到的错误

我可能太新了,不理解IComparable和IComparable(T)之间的细微差别。有人有主意吗? 提前感谢您的帮助, LJ

错误消息:

错误2类型“Algorithms.Node(Algorithms.Code)”不能用作泛型类型或方法“Algorithms.MinHeap(T)”中的类型参数“T”。没有从'Algorithms.Node(Algorithms.Code)'到'System.IComparable'的隐式引用转换

节点
未实现
i可比较
。它只是对
T
的类型有一个约束


看起来您已尝试实现该模式。同时实现接口,然后将方法映射到装饰对象。

您应该在节点类中实现IComparable接口,如下所示:

  public class Node<T>: IComparable<Node<T>> // <- IComparable<Node<T>> implemented  
    where T: IComparable  {

    T data;

    ...

    #region IComparable<Node<T>> Members

    // interface implementation, not just a method
    public int CompareTo(Node<T> other) {
      // Let us be accurate with possible nulls:  
      if (Object.ReferenceEquals(null, other))
        return 1; // <- or -1 if you think it's right
      else if (Object.ReferenceEquals(data, other.data))   
        return 0;
      else if (Object.ReferenceEquals(null, data))   
        return -1; // <- or 1 if you think it's right

      return data.CompareTo(other.data);
    }

    #endregion IComparable<Node<T>> Members
  }

公共类节点:IComparable/您最好定义泛型类,这样它就不需要类型来实现
IComparable
。这就是.NET泛型类的实现方式。他们将使用类型的默认比较,或者使用您传入的
IComparer
。例如,
SortedList
具有以下构造函数(以及其他构造函数):

SortedList();//使用TKey的默认比较器
分类列表(IComparer比较器);//使用提供的比较器
它很容易实现:

public class MinHeap<T>
{
    private IComparer<T> _comparer;

    public MinHeap<T>(IComparer<T> comp)
    {
        _comparer = comp;
    }

    public MinHeap<T>()
        : this(Comparer<T>.Default)
    {
    }
}
公共类MinHeap
{
私人IComparer\u comparer;
公共小堆(IComparer comp)
{
_比较器=comp;
}
公共垃圾堆()
:此(Comparer.Default)
{
}
}
这样,您的客户端就可以使用
MinHeap
来保存未实现
IComparable
的类的实例

进行比较时,调用
\u comparer.Compare(item1,item2)


另一方面,堆不需要特别需要节点。可以在数组中实现二进制堆。例如,请参见。

T
不仅应具有可比性,
节点也应具有可比性。以下操作应有效:
公共类节点:i可比,其中T:i可比
。MinHeap也一样@Aphelion有这样的解释。现在可以正常工作了-没有必要对MinHeap执行同样的操作-感谢LotusMinheap不必实现IComparable。@empi谢谢!我已经修改了答案。代码按照@leppie的建议修改,多亏了allI,我想你需要先做ReferenceEquals(data,other.data)。否则,如果
other.data==null
,它将始终返回-1,即使
this.data==null
。很抱歉,但ReferenceEquals(data,other.data)不能是第一个。如果另一个为空呢?在这种情况下,other.data将引发异常。
SortedList<TKey, TValue>(); // uses default comparer for TKey
SortedList<TKey, TValue>(IComparer<T> comparer); // uses supplied comparer
public class MinHeap<T>
{
    private IComparer<T> _comparer;

    public MinHeap<T>(IComparer<T> comp)
    {
        _comparer = comp;
    }

    public MinHeap<T>()
        : this(Comparer<T>.Default)
    {
    }
}