Vergleichen von Strukturen für Gleichheit ohne Boxen

Ich bin auf eine Erweiterungsmethode gestoßen, die für structs @ gil(SomeStruct) und gibt zurück, ob der Wert gleich dem @ idefault(SomeStruct) (wenn der parameterlose Konstruktor aufgerufen wird).

public static bool IsDefault<T> (this T value)
    where T : struct
{
    return (!EqualityComparer<T>.Default.Equals(value, default(T)));
}

Das hat mich gefragt, ob die Struktur eingepackt wurde. Dies ist rein aus Neugier, da es je nach Kontext Vor- und Nachteile für das Boxen / Weitergeben von Werten gibt.

Annahmen

Die erste der folgenden Methoden ist ungültig, da Strukturen die Gleichheitsoperatoren nicht implizit überschreiben.==/!=.Die zweite "erscheint", um Boxen zu vermeiden. Die dritte Methode sollte immer die Struktur boxen, da sie @ aufruobject.Equals(object o).Der vierte hat beide Überladungen zur Verfügung(object/T) also ich gehe davon aus, dass es auch Boxen vermeiden wird. Die Zielstruktur müsste jedoch das @ implementiereIEquatable<T> interface, wodurch die Hilfserweiterungsmethode nicht sehr hilfreich ist.

Variationen:

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)));
}

Bei dieser Frage geht es darum, obige Annahmen zu bestätigen und ob ich etwas missverstehe und / oder auslasse.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage