Следующее не компилирует:
public void MyMethod<T>(T value)
{
if (value == default(T))
{
// do stuff
}
}
Ошибка: Operator '==' cannot be applied to operands of type 'T' and 'T'
Я не могу использовать value == null
потому что T
может быть структура.
Я не могу использовать value.Equals(default(T))
потому что value
может быть null
.
Что надлежащий путь состоит в том, чтобы протестировать на равенство значению по умолчанию?
Чтобы избежать бокса для struct
/ Nullable
, я бы использовал:
if (EqualityComparer<T>.Default.Equals(value,default(T)))
{
// do stuff
}
Это поддерживает любой T
, который реализует IEquatable
, используя объект. Equals
как резервная копия, и обрабатывает null
и т.д. (и поднимает операторы для Nullable
) автоматически.
Также существует Comparer
, который обрабатывает сравнительные тесты. Он обрабатывает T
, которые реализуют IComparable
, возвращаясь к IComparable
- снова обрабатывает null
и поднимает операторы.