Ответы Дторпа и Джона близки, но не совсем верны.
Правильные рассуждения таковы.
В спецификации указано:
Для операции вида x op y, где op - оператор сравнения, перегрузкаразрешение применяется для выбора конкретной реализации оператора.
ОК, с какими реализациями операторов нужно работать разрешением перегрузки?Это:
bool operator <(int x, int y);
bool operator <(uint x, uint y);
bool operator <(long x, long y);
bool operator <(ulong x, ulong y);
bool operator <(float x, float y);
bool operator <(double x, double y);
bool operator <(decimal x, decimal y);
Плюс оператор «enum less-than» для всех перечисляемых типов, а также версии каждого из вышеперечисленных с возвратом в нуль.
Разрешение перегрузки должно сначала исключить неприменимых операторов, а затем из оставшегося набора применимых операторов определить оператор best .
Int,Все операторы uint, long и enum (и их поднятые формы) исключены, потому что ulong неявно преобразуется в эти типы.
Все операторы uint и ulong (и их поднятые формы) исключены, поскольку sbyte неявно не выполняетпреобразуйте в эти типы.
Это оставляет
bool operator <(float x, float y);
bool operator <(double x, double y);
bool operator <(decimal x, decimal y);
и их поднятые формы.Теперь мы должны определить оператор best из этих шести.
Что мы подразумеваем под «лучшим»?При сравнении двух операторов лучше использовать тот, у которого есть более конкретные типы операндов .Под «более конкретным» я подразумеваю, что «Тигр» более специфичен, чем «Животное», потому что все Тигры конвертируемы в Животных, но не все Животные конвертируемы в Тигров.
Очевидно, что неснятые формы лучше, чем всесоответствующие поднятые формы.Необнуляемый тип более специфичен, чем соответствующий ему обнуляемый тип, потому что не обнуляемый тип всегда конвертируем в свой обнуляемый тип, но не наоборот.Мы можем устранить поднятые формы.
Осталось три.Какой из этих трех лучший?
float более специфичен, чем double.Каждый float конвертируется в double, но не каждый double конвертируется в float.Поэтому двойной исключается.Осталось два.
bool operator <(float x, float y);
bool operator <(decimal x, decimal y);
Какой из них лучший?Не существует неявного преобразования с плавающей запятой в десятичную.Не существует неявного преобразования из десятичного в плавающее.Поэтому ни один из них не лучше другого.
Следовательно, нельзя определить лучшего оператора.Не удается разрешить перегрузку.
Мы решили сообщить об общем сообщении об ошибке, в котором просто говорится, что нет такого оператора, который делает то, что вам нужно, вместо того, чтобы выдавать на первый взгляд странное и запутанное сообщение об ошибке "разрешение перегрузки оператора не удалось, потому чтоfloat не лучше и не хуже десятичного числа ".Я думаю, что это разумный выбор дизайна.