Un conjunto es una colección de valores únicos. La implementación predeterminada de un conjunto en .NET es HashSet<T>.
La clase HashSet usa el método GetHashCode() de cada elemento.
Por defecto, la implementación de GetHashCode() para los tipos de referencia devuelve un hash de su ubicación en memoria. Esto significa que objetos distintos de tipos de referencia tendrán un código hash distinto (esto se conoce como igualdad de referencia). Los tipos de valor, por defecto, devuelven un hash de sus campos/propiedades. Esto significa que objetos de tipos de valor con los mismos valores de campos/propiedades tendrán el mismo código hash (esto se conoce como igualdad estructural).
Puedes sobrescribir la implementación de GetHashCode() en tus propias clases, lo que podrías usar para que un tipo de referencia tenga igualdad estructural.