Во-первых, вы, вероятно, хотите реализовать IEquatable<Tuple>
, а не IEquatable<object>
- Tuple : IEquatable<Tuple>
.
Во-вторых, равенство на изменчивом struct
- ужасная идея; Я настоятельно рекомендую вам использовать:
public readonly struct Tuple : IEquatable<Tuple>
{
public int Item1 { get; }
public int Item2 { get; }
public Tuple(int item1, int item2)
{
Item1 = item1;
Item2 = item2;
}
...
}
В-третьих, ваши Equals
и GetHashCode
должны согласиться. Если порядок не имеет значения до Equals
, то не должен иметь значения до GetHashCode
. Рассмотрим просто:
public override int GetHashCode() => Item1 ^ Item2;
или что-то еще, не зависящее от порядка.
Наконец, ваш Equals
, вероятно, может быть упрощен:
public override bool Equals(object obj) => obj is Tuple other && Equals(other);
public bool Equals(Tuple other)
=> (Item1 == other.Item1 && Item2 == other.Item2)
|| (Item1 == other.Item2 && Item2 == other.Item1);