【问题标题】:Object type does not implement IComparable对象类型未实现 IComparable
【发布时间】:2021-06-05 05:34:18
【问题描述】:

我有一个 LinkedList 类,其中每个节点都有一个数据,并且它们的数据是泛型类型 T

public class LinkedList<T> where T : IComparable
{
}

在它的方法中,我比较节点的数据,但是 我们知道,对象类型没有实现 IComparable,

LinkedList <int> listTest = new LinkedList<int>(); //it's OK
LinkedList <object> listTest2 = new LinkedList<object>(); //it doesn't work

但我如何比较所有可能代替 T 的类型?

【问题讨论】:

  • 我认为您误解了 IComparable 的使用。你能告诉我你想在这里达到什么目的吗?
  • @CaveCoder 好吧,我使用 CompareTo 方法来比较泛型类型。 CompareTo 可以比较整数、字符串等,但不能比较对象,因为对象没有实现 IComparable。我也想让比较对象成为可能。
  • 但是为什么要使用对象呢?您需要创建一个具有更多派生类作为通用参数的列表
  • 如果您的泛型类型被限制为只接受实现IComparable 的类型,那么您只能使用实现该接口的类型。这就是通用约束的作用。 object 类型实现任何接口。
  • 这几乎是要求比较苹果和橙子的能力...object 可以是任何东西,任何比较都是没有意义的。这就是说类似的功能(比如IEnumerable&lt;T&gt;.OrderBy允许调用者传递IComparer&lt;T&gt;,你可以为你的LinkedList&lt;T&gt;创建相同的结构,然后创建一个自定义IComparer&lt;object&gt;。但请记住,就像IEnumerable&lt;T&gt;.OrderBy你当无法进行比较时可能不得不抛出运行时异常

标签: c# object compare icomparable


【解决方案1】:

您不能使用对象类型,因为它没有实现 IComparable 并破坏通用约束。

您需要创建一个实现 IComparable 接口的新对象。

public class Foo : IComparable {
}

var list = new LinkedList<Foo>(); 

【讨论】:

  • 对不起,如果它已经是现有类型,怎么可能创建一个新对象?我不需要将我自己的课程放入列表中。只是对象类型。
  • 为什么需要对象类型?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多