質問: と Equals は同じだと思っていたのですが、違うのでしょうか? また、もしEqualsだけ型を厳密に見ていると仮定すると、trueを返すこともあるのが謎です。
回答: `Object.Equals(object)`は型が同じであれば`operator ==(T, T)`の結果を、型が異なれば`false`を返すのが標準的な動作です。 しかし質問文の例ではオーバーロードにより`int`から`long`への暗黙変換が発生しており、コード上の型が一致していません。 最初の二つの式ですが、C#の数値比較は`int`、`uint`、`long`、`ulong`同士の比較しか定義されていないため、`operator ==(long, long)`が選択されます。 また最後についても`IEquatable`の実装である`Int64.Equals(long)`が存在するため、こちらも暗黙変換が発生します。 これらの結果が`False`でないのはそのためです。