Como comparar valores de tipos genéricos?

Como comparo valores de tipos genéricos?

Reduzi-o para uma amostra mínima:

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

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

O erro é:

Operator '> =' não pode ser aplicado a operandos do tipo 'T' e 'T'

O que na Terra!?T já está restrito aIComparable, e mesmo ao restringi-lo a tipos de valor where T: struct), ainda não podemos aplicar nenhum dos operadores<, >, <=, >=, == ou!=. (Eu sei que as soluções alternativas que envolvemEquals() existe para== e!=, mas não ajuda para os operadores relacionais

Então, duas perguntas:

Por qu observamos esse comportamento estranho? O que nos impede de comparar os valores de tipos genéricos que sãoconhecid ser estarIComparable? De alguma forma, isso não derrota todo o objetivo das restrições genéricas?Como resolver isso, ou pelo menos contornar isso?

(Sei que já existem algumas perguntas relacionadas a esse problema aparentemente simples - mas nenhum dos tópicos fornece uma resposta exaustiva ou viável, então aqui.)

questionAnswers(8)

yourAnswerToTheQuestion