Как сравнить два элемента одного и того же, но неограниченного общего типа для равенства?

Возможный дубликат:
Оператор Cant == применяется к общим типам в С#?

У меня есть следующий общий класс, и компилятор жалуется, что "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(). Поскольку мне это нужно для обеих структур и классов, я был бы очень счастлив, если бы мог это избежать.

Итак, вопрос в том, как я могу сравнить два элемента одного и того же, но неограниченного общего типа для равенства?

Ответ 1

Вы попробовали что-то вроде этого?

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

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

Ответ 2

Три варианта:

  • Ограничьте TValue для реализации IEquatable<TValue>, а затем вызовите x.Equals(y)
  • Возьмите другой параметр типа IEqualityComparer<TValue> и используйте
  • Используйте EqualityComparer<TValue>.Default для выполнения сравнений

Вы всегда можете смешивать и сопоставлять варианты 2 и 3, конечно же - по умолчанию - по умолчанию, а также разрешать конкретный вариант.

Ответ 3

  • Equals() для типов значений
  • ReferenceEquals() для ссылочных типов

Ответ 4

Является ли 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");
            }
        }
    }
}

Ответ 5

Я думаю, что оператор != не может применяться здесь, потому что есть случаи, когда он не может быть использован. Например, != не может использоваться для сравнения структур, если только операторы сравнения (== !=) не перегружены.

Конечно, вы можете сравнивать языковые структуры, например int != int, но я не уверен, как это реализовано.

Итак, поскольку TValue может быть настраиваемой структурой, он не может использовать оператор !=.

Ответ 6

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