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.)