違う型の同じ数値を比較するときに == と Equals で結果が異なる？


int型とlong型で同じ数値を比較すると == はtrueを返しますが、Equalsはfalseを返すことがあります。

[code]

    Console.WriteLine("1 == 1L: {0}", 1 == 1L);
    Console.WriteLine("1L == 1: {0}", 1L == 1);
    Console.WriteLine("1.Equals(1L): {0}", 1.Equals(1L));
    Console.WriteLine("1L.Equals(1): {0}", 1L.Equals(1));
    
    // 出力：
    //   1 == 1L: True
    //   1L == 1: True
    //   1.Equals(1L): False
    //   1L.Equals(1): True
    
[/code]

値型では基本的に == と Equals は同じだと思っていたのですが、違うのでしょうか？

また、もしEqualsだけ型を厳密に見ていると仮定すると、trueを返すこともあるのが謎です。




`Object.Equals(object)`は型が同じであれば`operator ==(T,
T)`の結果を、型が異なれば`false`を返すのが標準的な動作です。  
しかし質問文の例ではオーバーロードにより`int`から`long`への暗黙変換が発生しており、コード上の型が一致していません。

最初の二つの式ですが、C#の数値比較は`int`、`uint`、`long`、`ulong`同士の比較しか定義されていないため、`operator
==(long, long)`が選択されます。  
また最後についても`IEquatable<T>`の実装である`Int64.Equals(long)`が存在するため、こちらも暗黙変換が発生します。  
これらの結果が`False`でないのはそのためです。




`Object.Equals(object)`は型が同じであれば`operator ==(T,
T)`の結果を、型が異なれば`false`を返すのが標準的な動作です。  
しかし質問文の例ではオーバーロードにより`int`から`long`への暗黙変換が発生しており、コード上の型が一致していません。

最初の二つの式ですが、C#の数値比較は`int`、`uint`、`long`、`ulong`同士の比較しか定義されていないため、`operator
==(long, long)`が選択されます。  
また最後についても`IEquatable<T>`の実装である`Int64.Equals(long)`が存在するため、こちらも暗黙変換が発生します。  
これらの結果が`False`でないのはそのためです。

