この質問を読んだ後、「int」と「sbyte」の GetHashCode 関数が異なる値を生成するのはなぜですか? さらに掘り下げて、次の動作を見つけました。
sbyte i = 1;
int j = 1;
object.Equals(i, j) //false (1)
object.Equals(j, i) //false (2)
i.Equals(j) //false (3)
j.Equals(i) //true (4)
i == j //true (5)
j == i //true (6)
i.GetHashCode() == j.GetHashCode() //false (7)
- (3) と (4) の違いは、Equals が対称でなければならないという要件を破っています。
- (2) と (4) の違いは、次のMSDN 仕様と一貫性がありません。
2 つのオブジェクトが同じオブジェクト参照を表さず、どちらも null でない場合、objA.Equals(objB) を呼び出して結果を返します。つまり、objA が Object.Equals(Object) メソッドをオーバーライドすると、このオーバーライドが呼び出されます。
- (3) と (5) の違いは、演算子 == が true を返すことを意味しますが、オブジェクトは Equals に関して等しくありません。
- (4)、(5)、(6)、(7) の違いは、2 つのオブジェクトが演算子 == と Equals に関して等しいことを意味しますが、ハッシュ コードは異なります。
私の意見では、このような一貫性のない動作がかなり基本的な .NET 型で観察される理由を誰かが説明できる場合、私は非常に興味があります。