Um conjunto é uma coleção de valores únicos. A implementação padrão de um conjunto no .NET é o HashSet<T>.
A classe HashSet usa o método GetHashCode() de cada elemento.
Por padrão, a implementação de GetHashCode() para tipos de referência retorna um hash do seu endereço de memória. Isso significa que objetos diferentes de tipos de referência terão códigos hash diferentes (isso é conhecido como igualdade de referência). Tipos de valor, por padrão, retornam um hash dos seus campos/propriedades. Isso significa que objetos diferentes de tipos de valor com os mesmos valores de campos/propriedades terão o mesmo código hash (isso é conhecido como igualdade estrutural).
Você pode sobrescrever a implementação de GetHashCode() nas suas próprias classes, o que você pode usar para fazer com que um tipo de referência tenha igualdade estrutural.