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 !? Tsą 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.)