短い答え:
平等は複雑です。
詳細な回答:
プリミティブタイプはベースobject.Equals(object)
をオーバーライドし、ボックス化されたタイプと値object
が同じ場合はtrueを返します。(null許容型でも機能することに注意してください。nullでないnull許容型は常に、基になる型のインスタンスにボックス化されます。)
以来newAge
でshort
、そのEquals(object)
あなたが箱入り渡す場合メソッドはtrueを返します短い同じ値を持つが。あなたは箱入りを渡しているint
ので、falseを返します。
対照的に、==
演算子は2つint
のs(またはshort
sまたはlong
s)を取ると定義されます。and
と一緒に呼び出すと、コンパイラは暗黙的にto を変換し、結果のsを値で比較します。int
short
short
int
int
それを機能させる他の方法
プリミティブ型にEquals()
は、同じ型を受け入れる独自のメソッドもあります。
を記述したage.Equals(newAge)
場合、コンパイラーはint.Equals(int)
最適なオーバーロードとして選択し、暗黙的にに変換short
しint
ます。true
このメソッドはint
sを直接比較するだけなので、を返します。
short
にもshort.Equals(short)
メソッドint
がありますが、暗黙的にに変換できないためshort
、それを呼び出すことはありません。
キャストでこのメソッドを呼び出すように強制できます。
Console.WriteLine(newAge.Equals((short)age)); // true
これはshort.Equals(short)
、ボクシングなしで直接呼び出されます。age
が32767より大きい場合、オーバーフロー例外がスローされます。
short.Equals(object)
オーバーロードを呼び出すこともできますが、ボックス化されたオブジェクトを明示的に渡して、同じタイプを取得します。
Console.WriteLine(newAge.Equals((object)(short)age)); // true
以前の代替案と同様に、これがに収まらない場合、オーバーフローがスローされますshort
。以前のソリューションとは異なり、それshort
はオブジェクトにボックス化し、時間とメモリを浪費します。
ソースコード:
Equals()
実際のソースコードからの両方のメソッドを次に示します。
public override bool Equals(Object obj) {
if (!(obj is Int16)) {
return false;
}
return m_value == ((Int16)obj).m_value;
}
public bool Equals(Int16 obj)
{
return m_value == obj;
}
参考文献:
参照してくださいエリックリッペルトを。