Сравнение структур на равенство без бокса
Я столкнулся с методом расширения, который применяется к структурам(SomeStruct)
и возвращает значение, равное ли значениеdefault(SomeStruct)
(когда вызывается конструктор без параметров).
public static bool IsDefault<T> (this T value)
where T : struct
{
return (!EqualityComparer<T>.Default.Equals(value, default(T)));
}
Это заставило меня задуматься, была ли структура в штучной упаковке. Это просто из любопытства, так как есть плюсы / минусы для бокса / передачи по значению в зависимости от контекста.
Предположения:
Первый из следующих методов недопустим, так как структуры неявно переопределяют операторы равенства==/!=
.Второй «появляется», чтобы избежать бокса.Третий метод должен всегда упаковывать структуру, так как он вызываетobject.Equals(object o)
.Четвертый имеет обе доступные перегрузки(object/T)
так что я полагаю, что это позволит избежать бокса. Однако целевая структура должна была бы реализоватьIEquatable<T>
интерфейс, что делает метод расширения помощника не очень полезным.Варианты:
public static bool IsDefault<T> (this T value)
where T : struct
{
// Illegal since there is no way to know whether T implements the ==/!= operators.
return (value == default(T));
}
public static bool IsDefault<T> (this T value)
where T : struct
{
return (!EqualityComparer<T>.Default.Equals(value, default(T)));
}
public static bool IsDefault<T> (this T value)
where T : struct
{
return (value.Equals(default(T)));
}
public static bool IsDefault<T> (this T value)
where T : struct, IEquatable<T>
{
return (value.Equals(default(T)));
}
Этот вопрос касается подтверждения вышеизложенных предположений, а также, если я неправильно понимаю и / или что-то упускаю.