Что я прочитал о HashSet, так это то, что он использует компаратор по умолчанию для класса. Я ожидаю, что приведенный ниже код не сработает при добавлении второго Spork в хеш-набор. Думаю, мое понимание происходящего неполное. Из MSDN конструктора HashSet:
Реализация IEqualityComparer для использования при сравнении значений в наборе или null, чтобы использовать реализацию EqualityComparer по умолчанию для типа набора.
Итак, что является компаратором по умолчанию и как я могу определить .Net использовать мой собственный компаратор?
public class Spork : IEquatable<Spork>
{
public int Id { get; set; }
public bool Equals(Spork other)
{
return other != null && other.Id == this.Id;
}
public override bool Equals(object obj)
{
var other = obj as Spork;
return other != null && other.Id == this.Id;
}
public override int GetHashCode()
{
return Id.GetHashCode();
}
}
public class Bjork
{
public static HashSet<Spork> Sporks { get; set; }
public static void Main()
{
Sporks = new HashSet<Spork>();
Sporks.Add(new Spork() { Id = 0 });
Sporks.Add(new Spork() { Id = 0 }); // come on, please throw an exception
}
}