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

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

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'
{
    // ...
}

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

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

Ответы [ 7 ]

12 голосов
/ 28 января 2011

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

if (!EqualityComparer<T>.Default.Equals(value1, value2))
3 голосов
/ 28 января 2011

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

И тогда вам придется использовать value1.Equals(value2)

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

2 голосов
/ 28 января 2011

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

if (!value1.Equals(value2))

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

1 голос
/ 28 января 2011

try

Equals(value1, value2)

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

1 голос
/ 28 января 2011

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

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

1 голос
/ 28 января 2011

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

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

0 голосов
/ 28 января 2011

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

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

public operator!=(T a, T b) {
    // Comparison code; returns true or false
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...