¿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!? TYa 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í).