С# сравнить два общих значения
Возможный дубликат:
Оператор 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, которые будут полезны для нас.
Попробуйте