¿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:
El operador '> =' no se puede aplicar a operandos de tipo 'T' y 'T'.
¿¡Que demonios!? T
Ya se ve limitado a IComparable
, e incluso cuando constreñir a los tipos de valor ( where T: struct
), todavía no podemos aplicar cualquiera de los operadores <
, >
, <=
, >=
, ==
o !=
. (Sé que Equals()
existen soluciones alternativas para ==
y !=
, pero no ayuda para los operadores relacionales).
Entonces, dos preguntas:
- ¿Por qué observamos este comportamiento extraño? ¿Qué nos impide comparar los valores de los tipos genéricos que se sabe que son
IComparable
? ¿No frustra de alguna manera todo el propósito de las restricciones genéricas? - ¿Cómo resuelvo esto, o al menos lo soluciono?
(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í).