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

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

Вопрос

Возможный Дубликат:
Разве operator == нельзя применить к универсальным типам в 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().Поскольку мне это нужно как для структур, так и для классов, я был бы очень рад, если бы смог избежать этого.

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

Это было полезно?

Решение

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

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 - по умолчанию для средства сравнения по умолчанию, но также разрешить предоставление определенного варианта.

  • 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