2

次の[c#]コードは、「演算子==はタイプ「T」および「T」のオペランドに適用できません」というエラーでコンパイルされません。

public class Widget<T> where T: IComparable
{
    public T value;
    public Widget(T input) { value = input; }
    public bool Equals<T>(Widget<T> w) where T : System.IComparable
    {
        return (w.value == value);
    }
}

w入力パラメーターのタイプTを、比較対象のオブジェクトと同じタイプTに制限して、それらを相互に比較できることを保証し、コンパイラーエラーを排除する方法はありますか?以下のように値の前に(動的)を使用するとコンパイルできますが、コンパイル時に問題をキャッチするより良い方法があるようです。

public bool Equals<T>(Widget<T> w) where T : System.IComparable { return (w.value == (dynamic) value); }

4

4 に答える 4

3

ここで値の平等に本当に興味があると仮定すると、次を使用できますEqualityComparer.Default

EqualityComparer<T> comparer = EqualityComparer<T>.Default;
return comparer.Equals(w.value, value);

Equals現在、あなたのメソッドもジェネリックであり、別の型パラメーターTを宣言しようとしていることに注意してください。本当にそうしたいとは思わない。

于 2012-05-10T19:29:01.387 に答える
0

これは、あなたの望むことですか?

public class Widget<T> : IEquatable<Widget<T>>, IComparable<Widget<T>>
    where T : IEquatable<T>, IComparable<T>
{
    public T value;
    public Widget(T input) { value=input; }
    public override bool Equals(object obj)
    {
        if(obj is Widget<T>)
        {
            return Equals(obj as Widget<T>);
        }
        return false;
    }
    public override int GetHashCode()
    {
        return value.GetHashCode();
    }
    public bool Equals(Widget<T> other)
    {
        return value.Equals(other.value);
    }

    public int CompareTo(Widget<T> other)
    {
        return value.CompareTo(other.value);
    }
    public static bool operator==(Widget<T> a, Widget<T> b)
    {
        return a.Equals(b);
    }
    public static bool operator!=(Widget<T> a, Widget<T> b)
    {
        return !a.Equals(b);
    }
    public static bool operator<(Widget<T> a, Widget<T> b)
    {
        return a.CompareTo(b)==-1;
    }
    public static bool operator>(Widget<T> a, Widget<T> b)
    {
        return a.CompareTo(b)==1;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Widget<int> a=new Widget<int>(100);
        Widget<int> b=new Widget<int>(200);

        if(a==b||a>b)
        {
        }
    }
}
于 2012-05-10T19:34:39.073 に答える
0
public class Widget<T> where T: IComparable
{
    public T value;
    public Widget(T input) { value = input; }
    public bool Equals(Widget<T> other)
    {
        if(value == null)
        {
          return other == null || other.Value == null;
        }
        if(other == null) return false; //ensure next line doesn't get null pointer exception
        return value.CompareTo(other.Value) == 0;
    }
}

valueother、およびnullのさまざまな順列での動作方法に基づいて、null チェック ロジックをいじる必要がある場合がありother.valueます。

于 2012-05-10T19:29:16.067 に答える
0
public class Widget<T> where T: IEquatable<T>
{
    public T value;
    public Widget(T input) { value = input; }
    public bool Equals(Widget<T> w)
    {
        return (w.value.Equals(this.value));
    }
}

等価比較が必要な場合は、 を使用する必要がありますIEquatableIComparable順序比較も必要な場合 (より小さい、より大きい) には、より適切です。

あなたの主な間違いは、Equals<T>メソッドに新しい型パラメーターを導入していることだと思います。しないでください。むしろ、パラメータの を、クラスがインスタンス化されたのと同じ型にしますT。これにより、が と同じ型になることがWidget<T>保証されます。w.Valuethis.value

于 2012-05-10T19:52:05.323 に答える