Insomma, sto cercando una guida su quale dei due metodi seguenti dovrebbe essere preferito (e perché):Quando specificare il vincolo `T: IEquatable <T>` anche se non è strettamente necessario?
static IEnumerable<T> DistinctA<T>(this IEnumerable<T> xs)
{
return new HashSet<T>(xs);
}
static IEnumerable<T> DistinctB<T>(this IEnumerable<T> xs) where T : IEquatable<T>
{
return new HashSet<T>(xs);
}
argomento a favore di
DistinctA
: Ovviamente, il vincolo sullaT
non è necessaria , perché non lo richiede e poiché le istanze di qualsiasiT
sono garantite per essere convertite inSystem.Object
, che fornisce la stessa funzionalità diIEquatable<T>
(vale a dire i due metodiEquals
eGetHashCode
). (Mentre i metodi non generici causano il pugilato con i tipi di valore, non è quello che mi riguarda qui.)Argomento a favore di
DistinctB
: Il vincolo del parametro generico, sebbene non strettamente necessario, rende visibile ai chiamanti il metodo confronta le istanze diT
ed è pertanto un segnale cheEquals
eGetHashCode
dovrebbe funzionare correttamente perT
. (Dopo tutto, la definizione di un nuovo tipo senza implementare esplicitamenteEquals
eGetHashCode
accade molto facilmente, quindi il vincolo potrebbe aiutare a catturare alcuni errori all'inizio.)
Domanda: C'è un migliore prassi consolidata e documentata che raccomanda quando specificare questo particolare vincolo (T : IEquatable<T>
) e quando no? E se no, uno degli argomenti di cui sopra è viziato in qualche modo? (In tal caso, preferirei argomenti ben congegnati, non solo opinioni personali.)
Dal momento che stai cercando argomenti ben congegnati e non opinioni personali, farò un rapido commento: preferisco la visibilità al chiamante quando cose come questa sono estremamente improbabili da cambiare in futuro. –