A volte, un umile metodo come l'Equals statico della classe System.Object può rendersi sorprendentemente utile. Per esempio, in una classe generica in cui il type parameter T può essere sia una class che una struct, abbiamo la necessità di controllare che un'istanza di T sia default(T).
class Foo<T> { public bool EqualsDefault(T t) { /* ? */ } }
Senza l'Equals statico le soluzioni sono abbastanza bruttine:
- non possiamo avere t == null perché T può essere una struct;
- non possiamo avere t == default(T) per l'errore CS0019 ("Operator '==' cannot be applied to operands of type 'T' and 'T'");
- non possiamo avere t.Equals(default(T)) perché se t è null, abbiamo NullReferenceException.
Utilizzando l'Equals statico invece, la soluzione diventa banale:
return object.Equals(t, default(T));