Согласно this article, я сопровождал свой Equal (Thing) следующим образом.StackOverflow при проектировании операторов сравнения
public override int GetHashCode() { return Id.GetHashCode(); }
public override bool Equals(object input)
{
Thing comparee = input as Thing;
return comparee != null && comparee.Id == Id;
}
public static bool operator ==(Thing self, Thing other)
{
return self != null && other != null && self.Id == other.Id;
}
public static bool operator !=(Thing self, Thing other)
{
return self == null || other == null || self.Id != other.Id;
}
Проблема в том, что, пока она работала до того, как я добавил переопределения оператора, теперь я получаю исключение StackOverflowException. Что мне не хватает?
Я вижу, как гладкость меняется только в одном месте. Однако как вы относитесь к * возврату ReferenceEquals (self, other) || self? .Id == other? .Id; * для равенства и * return! ReferenceEquals (self, other) || self? .Id! = other? .Id; * для неравенства? –
Я думаю, что, несмотря на то, что вы решили реализовать оператор равенства, вам все равно лучше реализовать не равный оператор, просто вернув не оператор равенства. Вот в чем смысл моего ответа здесь: не реализуйте дважды то, что вы можете реализовать только один раз. –
@ KonradViltersten: Похоже, ваша логика немного испортилась. '! a || b' - это не то же самое, что '! (a || b)'. (Причина № 7, почему лучше иметь логику в одном месте и все это ссылается на нее. :) – cHao