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