Как сравнивать значения универсальных типов?

Как сравнить значения универсальных типов?

Я сократил его до минимального образца:

public class Foo<T> where T : IComparable
{
    private T _minimumValue = default(T);

    public bool IsInRange(T value) 
    {
        return (value >= _minimumValue); // <-- Error here
    }
}

Ошибка:

Оператор '> =' не может применяться к операндам введите "Т" и "Т".

Что за черт !? T уже ограничен IComparable , и даже при ограничении его типами значений ( где T: struct ) мы по-прежнему не можем применить ни один из операторов <, > , <= , > = , == или ! = . (Я знаю, что обходные пути с использованием Equals () существуют для == и ! = , но это не помогает для операторов отношения).

Итак, два вопроса:

  1. Почему мы наблюдаем это странное поведение? Что мешает нам сравнивать значения универсальных типов, которые известны как IComparable ? Разве это не сводит на нет всю цель общих ограничений?
  2. Как мне решить эту проблему или, по крайней мере, обойти ее?

(Я понимаю, что уже есть несколько вопросов, связанных с этой, казалось бы, простой проблемой, но ни один из потоков не дает исчерпывающего или работоспособного ответа, поэтому вот.)

70
задан Pooven 13 December 2016 в 22:16
поделиться