Как сравнить значения универсальных типов?
Я сократил его до минимального образца:
public class Foo<T> where T : IComparable
{
private T _minimumValue = default(T);
public bool IsInRange(T value)
{
return (value >= _minimumValue); // <-- Error here
}
}
Ошибка:
Оператор '> =' нельзя применять к операндам типа 'T' и 'T'.
Что, черт возьми !? T
уже вынужден IComparable
, и даже тогда , когда ограничивает его к типам значений ( where T: struct
), мы можем не применять какие - либо из операторов <
, >
, <=
, >=
, ==
или !=
. (Я знаю, что Equals()
для ==
и существуют обходные пути !=
, но это не помогает для операторов отношения).
Итак, два вопроса:
- Почему мы наблюдаем это странное поведение? Что удерживает нас от сравнения значений общих типов , которые известны как
IComparable
? Разве это каким-то образом не уничтожает всю цель общих ограничений? - Как мне решить эту проблему или, по крайней мере, обойти это?
(Я понимаю, что уже есть несколько вопросов, связанных с этой, казалось бы, простой проблемой, но ни один из потоков не дает исчерпывающий или работоспособный ответ, поэтому вот.)