c# сравнить два общих значения [дубликат]
Возможные Дубликаты:
не может оператор == быть применен к универсальным типам в C#?
я закодировал что-то вроде этого:
public bool IsDataChanged()
{
T value1 = GetValue2;
T value2 = GetValue1();
return (valueInDB != valueFromView);
}
сейчас функция не компилируется с ошибкой "оператора!= не может применяться к операндам типа 'Т' и 'T'". Что мне нужно сделать, чтобы эта функция работала ?
5 ответов:
вы не можете использовать операторы на универсальных типах (за исключением foo = = null, который является специальным регистром), если вы не добавите where T: class, чтобы указать, что это ссылочный тип (тогда foo == bar является законным)
использовать
EqualityComparer<T>.По умолчанию, чтобы сделать это за вас. Это будет не работа на типах, которые только обеспечивают перегрузку оператора для = = Без также либо:
- реализовать
IEquatable<T>- переопределяет Object.Равно ()
В общем реализация оператора == и не выполнение хотя бы одного из них было бы очень плохой идеей в любом случае, поэтому это вряд ли будет проблемой.
public bool IsDataChanged<T>() { T value1 = GetValue2; T value2 = GetValue1(); return !EqualityComparer<T>.Default.Equals(value1 , value2); }если вы не ограничиваетесь
IEquatable<T>тогда запасной вариант по умолчанию EqualityComparer может вызвать бокс при использовании с типами значений, если они не реализуютIEquatable<T>(Если вы контролируете типы, которые используются это не важно). Я предполагаю, что вы используете =! для производительности, хотя так ограничение на общий тип позволит избежать случайно бокс через объект.Равно (объектный) маршрут.
ваш тип должен реализовать IComparable или IEquatable интерфейс.
тогда, вероятно, нужно переписать!=b как !(a==b), или вызовите метод CompareTo () или Equals () явно.
Это должно работать для вас.
public bool test<T>(T test, T test2) where T : class { return (test != test2); }Это просто вставлено из примеров, которые были прокомментированы на ваш вопрос.
вы можете перегрузить .Метод Equals () для ваших объектов и измените свою оценку на:
return (!valueInDB.Equals(valueFromView));предполагая, что valueInDB и valueFromView являются объектами. Ваши переменные примера не называются так же, как те, которые используются в сравнении, поэтому я должен был предположить.
EDIT: получил удар на 3 секунды! Примечание о перегрузке, если вам нужно сравнить значения внутри типа, основное .Equals() из класса Object будет недостаточно, так как он будет выполнять сравнение памяти только для сложных типы. Вам нужно будет перегрузить и обеспечить реализацию того, как вы хотите, чтобы объект сравнивался.
Genric ничего его говорят о широком форма для других типов, определенных в .инет так значения copare в родовой 1. Вам необходимо реализовать интерфейс IComparable или IEquatable. 1. Использовать.Равняется.,)(CompareTo методы, которые будут полезны для нас
попробовать себя
Comments