Тип объекта не реализует IComparable

У меня есть класс 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?


person vitaliiiiin    schedule 06.03.2021    source источник
comment
Я думаю, вы неправильно понимаете использование IComparable. Можете ли вы сказать мне, что вы пытаетесь достичь здесь?   -  person CaveCoder    schedule 07.03.2021
comment
@CaveCoder хорошо, я использую метод CompareTo для сравнения общих типов. CompareTo может сравнивать целые числа, строки и т. д., но не может сравнивать объекты, поскольку объекты не реализуют IComparable. Я также хочу сделать возможным сравнение объектов.   -  person vitaliiiiin    schedule 07.03.2021
comment
Но почему вы хотите использовать объект? вам нужно создать список с более производным классом в качестве общего аргумента   -  person CaveCoder    schedule 07.03.2021
comment
@CaveCoder на самом деле, я не хочу, но это моя домашняя работа в университете, и мой учитель просит сделать возможным работу с объектами.   -  person vitaliiiiin    schedule 07.03.2021
comment
Если ваш универсальный тип ограничен приемом только типов, реализующих IComparable, вы можете использовать только типы, реализующие этот интерфейс. Это то, что делают общие ограничения. Тип object не реализует какие-либо интерфейсы.   -  person Flydog57    schedule 07.03.2021
comment
Это почти буквально просьба о возможности сравнивать яблоки и апельсины... object может быть что угодно, любое сравнение не имеет смысла. Тем не менее, аналогичная функциональность (например, IEnumerable<T>.OrderBy позволяет вызывающему передать IComparer<T>, вы можете создать ту же конструкцию для своего LinkedList<T>, а затем создать собственный IComparer<object>. Однако имейте в виду, что, как и IEnumerable<T>.OrderBy, вам может потребоваться генерировать исключения во время выполнения, когда нет сравнение возможно   -  person Knoop    schedule 07.03.2021


Ответы (1)


Вы не можете использовать тип объекта, потому что он не реализует IComparable и не нарушает универсальное ограничение.

Вам нужно создать новый объект, реализующий интерфейс IComparable.

public class Foo : IComparable {
}

var list = new LinkedList<Foo>(); 
person CaveCoder    schedule 06.03.2021
comment
спасибо, буду тестировать рн :) - person vitaliiiiin; 07.03.2021
comment
Простите, а как можно создать новый объект, если это уже существующий тип? Мне не нужно помещать в список свои собственные классы. Просто тип объекта. - person vitaliiiiin; 07.03.2021
comment
зачем вам тип объекта? - person CaveCoder; 07.03.2021