Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

CompareTo и object

#c_sharp #сравнение


Здравствуйте. У меня появился такой вопрос: зачем в C# метод CompareTo интерфейса
IComparable принимает параметр типа object? Не проще ли принимать параметр того же
типа IComparable? Заранее спасибо    


Ответы

Ответ 1



В .NET на самом деле есть оба интерфейса: IComparable и IComparable. Первый сохраняется как наследие со времён .NET 1.x, в котором не было обобщённых типов (генериков). Для старого IComparable каким может быть тип аргумента функции CompareTo? Это должен быть один тип на все возможные случаи использования, для сравнения любого типа с собой, так что единственное, что может в принципе подойти, это object. Для нового IComparable мы можем объявить возможность сравнения с любым типом Т, которым захотим. Разумеется, никто не помешает написать class A : IComparable { ... — но правильное использование интерфейса, конечно, для сравнения с объектами того же самого типа: class A : IComparable<А> { ... К сожалению, система типов .NET на текущий момент недостаточно сильна, чтобы выразить ограничение «тип, сравнимый с самим собой», а не просто «тип, сравнимый с данным типом». Если вам интересны языки с более развитой системой типов, гляньте в сторону функциональных языков.

Ответ 2



Этого достаточно Это намного проще с точки зрения дизайна языка. Например, вы пишите метод сортировки и объявляете его как void Sort(IList list) where T : IComparable тем самым давая возможность сортировать объекты любых сравнимых типов. Единственный способ сделать строготипизированный интерфейс IComparable, это объявить его как interface IComparable { int CompareTo(T obj); } Но тогда никто не запретит вам сделать это class Foo : IComparable, IComparable {...} Что, согласитесь, совсем не логично.

Комментариев нет:

Отправить комментарий