セットは、一意の値の集まりです。.NETでセットの既定の実装は、HashSet<T>です。
HashSetクラスは、各要素のGetHashCode()メソッドを使います。
既定では、参照型のGetHashCode()の実装は、そのメモリ上の位置のハッシュを返します。つまり、異なる参照型のオブジェクトは異なるハッシュコードを持ちます(これを参照の等価性と呼びます)。一方、値型は既定ではそのフィールドやプロパティのハッシュを返します。つまり、同じフィールドやプロパティの値を持つ異なる値型のオブジェクトは同じハッシュコードを持ちます(これを構造的等価性と呼びます)。
自分のクラスでGetHashCode()の実装をオーバーライドすることもできます。これを使えば、参照型に構造的等価性を持たせることができます。