比較のあり方につ要素の同一であるが、自由闊達な汎用タイプ等?[重複]

StackOverflow https://stackoverflow.com/questions/336884

質問

可能な重複:
できないオペレーター==適用される汎用型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");
            }
        }
    }
}

がん抑制 TValueclass, う Object.Equals().ていることをboths構造体および授業にいるようであれば、すごく嬉しいかなるものです。

その質問は、どのように私の二つの要素を同一であるが、自由闊達な汎用タイプ等?

役に立ちましたか?

解決

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

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

            if (!object.Equals(_value, value))
            {
                _value = value;
                OnPropertyChanged("Value");
            }
        }
    }
}

他のヒント

三つのオプション:

  • 制TValueの実施 IEquatable<TValue> を呼び出 x.Equals(y)
  • 他のパラメータの型 IEqualityComparer<TValue> その
  • 使用 EqualityComparer<TValue>.Default 行の比較

まず、オプション2と3コース-デフォルトのデフォルトのcomparerですが、特定の一つです。

  • 値型のEquals()
  • 参照型のReferenceEquals()

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");
            }
        }
    }
}

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

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

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

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;
        }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top