Сравнение структур на равенство без бокса

Я столкнулся с методом расширения, который применяется к структурам(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)));
}

Этот вопрос касается подтверждения вышеизложенных предположений, а также, если я неправильно понимаю и / или что-то упускаю.

Ответы на вопрос(1)

Ваш ответ на вопрос