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

Возможный дубликат:
Не может ли оператор == быть применен к универсальным типам в C#?

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

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

    return (valueInDB != valueFromView);
}

Прямо сейчас функция не компилируется с ошибкой "Оператор!!=" Не может быть применен к операндам типа "Т" и "Т"". Что мне нужно сделать, чтобы эта функция работала?

4 ответа

Решение

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

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

  • воплощать в жизнь IEquatable<T>
  • переопределяет объект.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(объект).

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

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

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

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

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

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

return (!valueInDB.Equals(valueFromView));

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

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

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

Попробуй себя

Другие вопросы по тегам