Jak porównać wartości typów ogólnych?
Zredukowałem to do minimalnej próbki:
public class Foo<T> where T : IComparable
{
private T _minimumValue = default(T);
public bool IsInRange(T value)
{
return (value >= _minimumValue); // <-- Error here
}
}
Błąd:
Operator „> =” nie może być stosowany do operandów typu „T” i „T”.
Co u licha !? T
są już ograniczone do IComparable
, a nawet kiedy ograniczanie go do typów wartości ( where T: struct
), nadal nie może zastosować każdy z operatorów <
, >
, <=
, >=
, ==
lub !=
. (Wiem, że Equals()
istnieją obejścia dotyczące ==
i !=
, ale nie pomaga to operatorom relacyjnym).
A więc dwa pytania:
- Dlaczego obserwujemy to dziwne zachowanie? Co powstrzymuje nas przed porównaniem wartości typów ogólnych, o których wiadomo, że są
IComparable
? Czy nie jest to w jakiś sposób sprzeczne z celem ogólnych ograniczeń? - Jak to rozwiązać lub przynajmniej obejść?
(Zdaję sobie sprawę, że jest już kilka pytań związanych z tym pozornie prostym problemem - ale żaden z wątków nie daje wyczerpującej ani praktycznej odpowiedzi, więc tutaj.)