Ho letto la seguente dichiarazione relativa al confronto dei tipi di valore C# in C# in Depth, Second Edition più volte.Confronti diretti di tipi di valore C#
pagina 77,
Quando un parametro tipo è vincolata (vincoli vengono applicati ad esso), è possibile utilizzare == e! = Operatori, ma solo per confrontare un valore di quel tipo con null. Non è possibile confrontare due valori di tipo T l'uno con l'altro.
...
Quando un parametro di tipo è costretto a essere un tipo di valore, == e! = Non può essere utilizzato con esso a tutti.
Se ho capito (io non la penso così) in modo corretto, fondamentalmente mi dice che non si può uso == o! = Per confrontare due tipi di valore. Perché perché perché?
Sarà meglio se un esempio semplice può essere dato per questo caso. Qualcuno può darmi una piccola idea di ciò che il paragrafo precedente cerca di trasmettere?
Sospetto che ciò eviti confusione con l'overloading dell'operatore, poiché un operatore == sovraccarico non verrebbe utilizzato quando il parametro di tipo generico è un tipo di valore. È possibile utilizzare Object.Equals, tuttavia, quali implementano i tipi di valore ben educati e che avranno lo stesso comportamento di == (per i tipi ben educati). –
@Dan Bryant, non è solo per evitare confusione. Non c'è alcuna garanzia che un tipo di valore supporti gli operatori == e! =, E noi * non possiamo usare l'implementazione System.Object per i tipi di valore, perché il test dell'eguaglianza di riferimento funziona solo su istanze in box. * Bene, potremmo in teoria specificare che gli operandi siano inscatolati per utilizzare il controllo di uguaglianza di riferimento, ma in tal caso l'espressione sarebbe sempre falsa, il che è chiaramente inutile. – phoog
@phoog, lo 'Object.Equals' statico chiamerà effettivamente l'implementazione Equals dell'oggetto (anche se è un tipo di valore in box), quindi è un modo valido per confrontare i tipi di valore pari. Gestisce anche il confronto di null con i tipi di valore. 'Object.ReferenceEquals' costringe esplicitamente il controllo a essere per l'uguaglianza di riferimento, che può essere utile nei casi in cui un tipo di riferimento sovrascrive l'operatore di uguaglianza, ma ha un bug per il caso di confronto nullo (ho incontrato questo prima con un terzo- API party.) –