Невозможно сравнить T value1 с T value2 = по умолчанию (T). Почему и как это сделать на C #?

c# types comparison

800 просмотра

7 ответа

1207 Репутация автора

Я пытаюсь следующее:

T value1 = el.value; // it's of type T already
T value2 = default(T);
if (value1 != value2) // gives the following error: Operator '!=' cannot be applied to operands of type 'T' and 'T'
{
    // ...
}

Итак, как я могу сравнить оба значения? И почему возникает эта ошибка?

Заранее спасибо!

Автор: Girardi Источник Размещён: 28.01.2011 07:21

Ответы (7)


3 плюса

218341 Репутация автора

Ваш окружающий универсальный класс должен перечислить ограничение: T : IEquatable<T>

И тогда вы должны использовать value1.Equals(value2)

Причина всего этого заключается в том, что не все типы определяют оператор ==

Автор: Henk Holterman Размещён: 28.01.2011 07:23

2 плюса

58330 Репутация автора

Что с этим не так?

if (!value1.Equals(value2))

Должен быть "перекрестный объект" .. :)

Автор: Shadow The Princess Wizard Размещён: 28.01.2011 07:24

12 плюса

1143421 Репутация автора

Решение

Вы можете использовать ограничение, where T : IEquatable<T>как упомянул Хенк, или игнорировать ограничения и использовать:

if (!EqualityComparer<T>.Default.Equals(value1, value2))
Автор: Jon Skeet Размещён: 28.01.2011 07:24

0 плюса

6777 Репутация автора

Другая вещь, которую вы могли бы сделать, это определить оператор сравнения (на самом деле, здесь оператор разности), чтобы иметь возможность сравнивать элементы типа T. Сам по себе компилятор не может действительно знать, что вы имеете в виду, когда пишете value1 != value2, за исключением случаев, когда оператор имеет был определен ранее.

Чтобы определить оператора, вы бы использовали

public operator!=(T a, T b) {
    // Comparison code; returns true or false
}
Автор: Clément Размещён: 28.01.2011 07:25

1 плюс

1813 Репутация автора

если вы используете value1.equals (value2), тогда у вас есть проблема с нулевыми значениями. Лучше:
object.equals (значение1, значение2)

Или для ссылочных типов (будьте осторожны):
object.referenceEquals (value1, value2)

Автор: Zotta Размещён: 28.01.2011 07:31

1 плюс

15931 Репутация автора

Не все типы имеют реализацию ==оператора по умолчанию . Для классов ==операцией по умолчанию является сравнение ссылок. Для структур не существует такой реализации по умолчанию.

Вы можете добавить ограничения типа к параметрам универсального типа в C #. К сожалению, вы не можете определить ограничение, которое заставляет тип иметь реализацию ==оператора. Лучшее , что вы можете сделать , это заставить тип быть классом: where T: class. Статья об ограничениях параметров типа в C #

Автор: Elian Ebbing Размещён: 28.01.2011 07:33

1 плюс

0 Репутация автора

пытаться

Equals(value1, value2)

Хороший способ избежать нулевых ссылок

Автор: user448374 Размещён: 28.01.2011 07:34
Вопросы из категории :
32x32