¿Cómo comparar valores de tipos genéricos?

¿Cómo comparo valores de tipos genéricos?

Lo he reducido a una muestra mínima:

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

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

El error es:

Operator '> =' no se puede aplicar a operandos de tipo 'T' y 'T'.

¿¡Qué en la tierra!? @T ya está limitado aIComparable, e incluso al restringirlo a los tipos de valor where T: struct), todavía no podemos aplicar ninguno de los operadores<, >, <=, >=, == o!=. (Sé que las soluciones alternativas que involucran aEquals() existe para== y!=, pero no ayuda a los operadores relacionales).

Entonces, dos preguntas:

Por qu ¿observamos este comportamiento extraño? Lo que nos impide comparar los valores de los tipos genéricos que sonconocid serIComparable? ¿No de alguna manera vence el propósito completo de las restricciones genéricas? ¿Cómo resuelvo esto, o al menos evito esto?

(Me doy cuenta de que ya hay un puñado de preguntas relacionadas con este problema aparentemente simple, pero ninguno de los hilos da una respuesta exhaustiva o viable, así que aquí.)

Respuestas a la pregunta(8)

Su respuesta a la pregunta