Невозможно сравнить T value1 с T value2 = по умолчанию (T). Почему и как это сделать на C #?
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)
Причина всего этого заключается в том, что не все типы определяют оператор ==
2 плюса
Что с этим не так?
if (!value1.Equals(value2))
Должен быть "перекрестный объект" .. :)
Автор: Shadow The Princess Wizard Размещён: 28.01.2011 07:241 плюс
если вы используете value1.equals (value2), тогда у вас есть проблема с нулевыми значениями. Лучше:
object.equals (значение1, значение2)
Или для ссылочных типов (будьте осторожны):
object.referenceEquals (value1, value2)
1 плюс
Не все типы имеют реализацию ==
оператора по умолчанию . Для классов ==
операцией по умолчанию является сравнение ссылок. Для структур не существует такой реализации по умолчанию.
Вы можете добавить ограничения типа к параметрам универсального типа в C #. К сожалению, вы не можете определить ограничение, которое заставляет тип иметь реализацию ==
оператора. Лучшее , что вы можете сделать , это заставить тип быть классом: where T: class
. Статья об ограничениях параметров типа в C #
1 плюс
пытаться
Equals(value1, value2)
Хороший способ избежать нулевых ссылок
Автор: user448374 Размещён: 28.01.2011 07:340 плюса
Другая вещь, которую вы могли бы сделать, это определить оператор сравнения (на самом деле, здесь оператор разности), чтобы иметь возможность сравнивать элементы типа T. Сам по себе компилятор не может действительно знать, что вы имеете в виду, когда пишете value1 != value2
, за исключением случаев, когда оператор имеет был определен ранее.
Чтобы определить оператора, вы бы использовали
public operator!=(T a, T b) {
// Comparison code; returns true or false
}
Автор: Clément
Размещён: 28.01.2011 07:25
Вопросы из категории :
- c# Преобразовать десятичную в двойную?
- c# Как рассчитать чей-то возраст в C #?
- c# Как вы сортируете словарь по значению?
- c# В чем разница между int и Integer в Java и C #?
- c# Как создать новый экземпляр объекта из Типа
- c# Datatable против Dataset
- types В чем разница между строкой и строкой в ??C #?
- types В чем разница между старым и новым стилем классов в Python?
- types Что хорошего в дженериках, зачем их использовать?
- types Что такое типы POD в C ++?
- types Какой канонический способ проверить тип в Python?
- comparison Comparing two collections for equality irrespective of the order of items in them
- comparison Чем отличаются операторы сравнения PHP (== double equals) и тождества (=== triple equals)?
- comparison Что такое «Лучшая практика» для сравнения двух экземпляров ссылочного типа?
- comparison Сортировка по строке, которая может содержать число
- comparison Использование сравнений OR с операторами IF
- comparison Сравните двойной в точности задачи VBA