10

重複の可能性:
演算子 == を C# のジェネリック型に適用できませんか?

私は次の汎用クラスを持っていますが、コンパイラは " Operator '!=' cannot be applied to operands of type 'TValue' and 'TValue'" ( CS0019を参照) と不平を言います:

public class Example<TValue>
{
    private TValue _value;
    public TValue Value
    {
        get { return _value; }
        set
        {
            if (_value != value) // <<-- ERROR
            {
                _value= value;
                OnPropertyChanged("Value");
            }
        }
    }
}

に制約TValueするとclass、 を使用できますObject.Equals()。構造体とクラスの両方にこれが必要なので、それを避けることができればとてもうれしいです。

問題は、同じであるが制約のないジェネリック型の 2 つの要素が等しいかどうかを比較するにはどうすればよいかということです。

4

6 に答える 6

15

このようなことを試しましたか?

public class Example<TValue>
{
    private TValue _value;
    public TValue Value
    {
        get { return _value; }
        set
        {

            if (!object.Equals(_value, value))
            {
                _value = value;
                OnPropertyChanged("Value");
            }
        }
    }
}
于 2008-12-03T12:02:00.313 に答える
7

3 つのオプション:

  • TValue を実装IEquatable<TValue>してから呼び出すように制約するx.Equals(y)
  • タイプの別のパラメーターを取りIEqualityComparer<TValue>、それを使用します
  • EqualityComparer<TValue>.Default比較を実行するために使用します

もちろん、オプション 2 と 3 をいつでも組み合わせて一致させることができます。デフォルトはデフォルトの比較子ですが、特定の比較子を指定することもできます。

于 2008-12-03T12:47:40.003 に答える
2
  • 値型の Equals()
  • 参照型の ReferenceEquals()
于 2008-12-03T11:48:26.330 に答える
1

IComparable はオプションですか?

public class Example<TValue> where TValue: IComparable
{
    private TValue _value;
    public TValue Value
    {
        get { return _value; }
        set
        {

            if (_value.CompareTo(value) != 0)
            {
                _value = value;
                OnPropertyChanged("Value");
            }
        }
    }
}
于 2008-12-03T12:39:28.897 に答える
0
public static bool operator ==(EntityBase<T> entity1, EntityBase<T> entity2)
        {
            if ((object)entity1 == null && (object)entity2 == null)
            {
                return true;
            }

            if ((object)entity1 == null || (object)entity2 == null)
            {
                return false;
            }

            if (Comparer<T>.Default.Compare(entity1.Id, entity2.Id) != 0)
            {
                return false;
            }

            return true;
        }
于 2011-07-14T10:17:20.043 に答える
0

!=演算子は使えない場合があるのでここでは当てはまらないと思います。たとえば、比較演算子 ( ) がオーバーロード!=されていない限り、構造体の比較には使用できません。== !=

もちろん、 のような言語構造体を比較することはできますが、int != intこれがどのように実装されているかはわかりません。

したがって、TValue はカスタム!=構造体になる可能性があるため、演算子を使用できません。

于 2008-12-03T12:39:28.757 に答える