С# сравнить два общих значения

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

Я закодировал что-то вроде этого:

public bool IsDataChanged()
{           
    T value1 = GetValue2;
    T value2 = GetValue1();

    return (valueInDB != valueFromView);
}

В настоящее время функция не компилируется с ошибкой "Operator"!= 'не может применяться к операндам типа "T" и "T". Что мне нужно сделать, чтобы эта функция работала?

Ответы

Ответ 1

Вы не можете использовать операторы для общих типов (за исключением foo == null, который является специальным обведенным), если вы не добавите, где T: class, чтобы указать, что это ссылочный тип (тогда foo == bar является законным)

Используйте EqualityComparer<T>.Default, чтобы сделать это за вас. Это будет не работать с типами, которые обеспечивают только перегрузку оператора для == без: либо

  • реализовать IEquatable<T>
  • переопределяет object.Equals()

В целом реализация оператора == и не выполнение хотя бы одного из них было бы очень плохой идеей, так что это вряд ли будет проблемой.

public bool IsDataChanged<T>()
{           
    T value1 = GetValue2;
    T value2 = GetValue1();

    return !EqualityComparer<T>.Default.Equals(value1 , value2);
}

Если вы не ограничиваете IEquatable<T>, тогда резерв по умолчанию EqualityComparer может привести к боксу при использовании с типами значений, если они не реализуют IEquatable<T> (если вы контролируете используемые типы, это может и не иметь значения). Я предполагаю, что вы использовали =! для производительности, хотя поэтому ограничение на тип Generic позволит избежать случайного бокса по маршруту Object.Equals(object).

Ответ 2

Ваш тип должен реализовать IComparable или IEquatable.

Возможно, вам необходимо переписать a!= b как! (a == b) или вызвать метод CompareTo() или Equals() явно.

Ответ 3

Это должно сработать для вас.

public bool test<T>(T test, T test2) where T : class
{
    return (test != test2);
}

Это просто вставлено из примеров, которые были прокомментированы по вашему вопросу.

Ответ 4

Вы можете перегрузить метод .Equals() на свои объекты и изменить свою оценку на:

return (!valueInDB.Equals(valueFromView));

Предполагая, что valueInDB и valueFromView являются объектами. Ваши переменные-примеры не называются теми же, что и в сравнении, поэтому я должен был предположить.

РЕДАКТИРОВАТЬ: Получил удар на 3 секунды! Замечание о перегрузке, если вам нужно сравнить значения внутри типа, базового .Equals() из класса Object будет недостаточно, поскольку он будет выполнять только сравнение памяти для сложных типов. Вам нужно будет перегрузить и обеспечить реализацию того, как вы хотите сравнить объект.

Ответ 5

Генрих - это не что-то своеобразная форма для других типов, определенных в .net, поэтому значения copare в generic 1. Вам необходимо реализовать интерфейс IComparable или IEquatable. 1. Используйте методы .Equals(), CompareTo, которые будут полезны для нас.

Попробуйте