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がを得ることです。私は何が欠けていますか?
私は、ある場所でしか変化の滑らかさを見ません。しかし、あなたはどのように感じるでしょうか?ReturnEquals(self、other)|| self?.Id == other?.Id; *等価と*リターンのために!ReferenceEquals(self、other)||自己ですか?Id!=他?.Id; *不等式のために? –
私はそうだと思います。等価演算子を実装することを選択したにもかかわらず、等価演算子ではなく単に等しくない演算子を実装する方が良いです。それは私の答えの全体のポイントです - あなたが一度だけ実装できるものを2回実装しないでください。 –
@ KonradViltersten:あなたのロジックがちょっと混乱しているように見えます。 '!a || bは '!(a || b)'と同じではありません。 (理由#7なぜ1つの場所にロジックを持ち、それ以外のものはそれを参照している方が良いのでしょうか。:) – cHao