Um conjunto é uma coleção de valores únicos. A implementação predefinida do .NET para um conjunto é o HashSet<T>.
A classe HashSet usa o método GetHashCode() de cada elemento.
Por predefinição, a implementação de GetHashCode() para tipos de referência devolve um hash da sua localização na memória. Isto significa que objetos diferentes de um tipo de referência têm um código de hash diferente (a isto chama-se igualdade de referência). Os tipos de valor devolvem, por predefinição, um hash dos seus campos/propriedades. Isto significa que objetos diferentes de um tipo de valor com os mesmos valores nos campos/propriedades têm o mesmo código de hash (a isto chama-se igualdade estrutural).
Podes substituir a implementação de GetHashCode() nas tuas próprias classes, o que podes usar para que um tipo de referência tenha igualdade estrutural.