Подтвердить что ты не робот

Проверка равенства по умолчанию

Не компилируется следующее:

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.
Каков правильный способ проверки равенства по умолчанию?

4b9b3361

Ответ 1

Чтобы избежать бокса для struct/Nullable<T>, я бы использовал:

if (EqualityComparer<T>.Default.Equals(value,default(T)))
{
    // do stuff
}

Это поддерживает любой T, реализующий IEquatable<T>, используя object.Equals в качестве резервной копии и автоматически обрабатывая null и т.д. (и снимая операторы для Nullable<T>).

Существует также Comparer<T>.Default, который обрабатывает сравнительные тесты. Это обрабатывает T, которые реализуют IComparable<T>, возвращаясь к IComparable - снова обрабатывая null и снятые операторы.

Ответ 2

Что насчет

object.Equals(value, default(T))