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(),. Сравните методы, которые будут полезны для нас.
Попробуй себя