Тип HashSet<T>
в конечном итоге использует равенство, чтобы определить, равны ли 2 объекта или нет. В типе Foo
вы только переопределяете GetHashCode
, а не равенство. Это означает, что проверки на равенство по умолчанию вернутся к Object.Equals
, который использует равенство ссылок. Это объясняет, почему вы видите несколько элементов в HashSet<Foo>
.
Чтобы это исправить, вам нужно переопределить Equals
в типе Foo
.
public override bool Equals(object obj) {
var other = obj as Foo;
if (other == null) {
return false;
}
return c1 == other.c1 && c2 == other.c2;
}