Ответ 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
и снятые операторы.