IComparable<T>インターフェースやIComparer<T>インターフェイスで実装されるCompareToメソッド・Compareメソッドは、<
, >
, <=
, >=
といった比較演算子の役割と似たものですが、両者は全く独立したものであり、このインターフェイスを実装したからといって比較演算子を用いた比較が出来るようになるわけではありません。 比較演算子を用いて比較するには、別途演算子をオーバーロードしなければなりません。 また逆に、比較演算子をオーバーロードしたからといってソートが出来るようになるというわけでもありません。 ソートするには型がIComparable<T>やIComparableなどのインターフェイスを実装している必要があります。
しかし、独自のクラスを構築する際、IComparable<T>等による比較(さらにソート)と比較演算子による比較の両方が出来るようにしたい場合も当然出てきます。
以下の例では、IComparable<T>の実装と比較演算子のオーバーロードを行ったクラスを作成しています。 このクラスでは、まずIComparable<T>で大小関係の定義と比較処理を実装し、オーバーロードした比較演算子ではIComparable<T>.CompareToを呼び出してその結果を使うようにしています。
なお、この例ではnull/Nothingと比較しようとした場合はArgumentNullExceptionをスローするようにしていますが、文字列型(string)のようにnull/Nothingは他のすべての値よりも小さいというように実装することも出来ます。
もう一つ別の例を挙げます。 次の例において、Accountクラスでは比較演算子のオーバーロードのみを行い、ソートに必要となる処理はComparer<T>クラスを継承した別のクラスAccountComparerで実装しています。