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

c# types comparison

800 просмотра

7 ответа

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

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 Источник Размещён: 12.11.2019 09:56

Ответы (7)


12 плюса

Решение

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

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

3 плюса

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

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

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

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

2 плюса

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

if (!value1.Equals(value2))

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

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

1 плюс

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

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

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

1 плюс

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

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

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

1 плюс

пытаться

Equals(value1, value2)

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

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

0 плюса

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

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

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