c# сравнить два общих значения [дубликат]




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






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



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

return (valueInDB != valueFromView);
}


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

535   5  

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

    Ничего не найдено.