1. ホーム
  2. c#

[解決済み] 汎用型の値を比較するには?

2023-03-24 13:17:24

質問

汎用型の値を比較するにはどうしたらよいですか?

最小限のサンプルに落とし込みました。

public class Foo<T> where T : IComparable
{
    private T _minimumValue = default(T);

    public bool IsInRange(T value) 
    {
        return (value >= _minimumValue); // <-- Error here
    }
}

エラーは

演算子 '>=' は、型 'T' および 'T' のオペランドに適用できません。

いったい何!? T はすでに制約を受けていて IComparable に制約されており、値型に制約する場合でも ( where T: struct ) の場合、どの演算子も適用することができません。 < , > , <= , >= , == または != . (を含む回避策があることは知っています。 Equals() が存在することは知っています。 ==!= というように、関係演算子では役に立ちません)。

では、2つの質問です。

  1. なぜ はこの奇妙な振る舞いを観察するのでしょうか?を持つジェネリック型の値を比較しないのはなぜでしょうか? 既知の である IComparable ? それは何らかの形でジェネリック制約の全体の目的を打ち破らないのでしょうか?
  2. どのようにこれを解決するか、または少なくともそれを回避するか。

(この一見単純な問題に関連する少数の質問がすでにあることは承知しています。しかし、どのスレッドも網羅的または実行可能な答えを与えていないので、ここで説明します)。

どのように解決するのですか?

IComparable がオーバーロードしないように >= 演算子をオーバーロードしません。そのため

value.CompareTo(_minimumValue) >= 0