2 つのタプルを定義するとします。
Tuple<float, float, float, float> tuple1 = new Tuple<float, float, float, float>(1.0f, 2.0f, 3.0f, 4.0f);
Tuple<float, float, float, float> tuple2 = new Tuple<float, float, float, float>(1.0f, 2.0f, 3.0f, 4.0f);
タプルを比較しようとすると、異なる結果が得られます
bool result1 = (tuple1 == tuple2); // FALSE
bool result2 = tuple1.Equals(tuple2); // TRUE
両方の呼び出しが true を返すことを期待します。正確には何を==
比較するのでしょうか?
ベストアンサー1
タプルの場合、==はオブジェクト参照を比較します。過負荷演算子==
。オブジェクトは同等ですが、特定のインスタンスは同じではないため、Equals()
は を返しtrue
、==
は を返しますfalse
。
多くの型は をオーバーロードしませんが、同等性の場合と参照の同等性の==
場合を区別することを好む型もあります。Equals()
==
さらに、==
同等性のために に頼ると、奇妙な結果が生じる可能性があります。
public bool AreSame<T>(T first, T second) where T : class
{
return first == second;
}
上記のコードでは、制約のないジェネリックはコンパイル時に とみなされるため、参照の等価性を常にチェックします。したがって、メソッドが仮想でない場合は、オブジェクトのバージョンが取得されます (オーバーロードobject
などの型であっても)。string
==
したがって、上記のコードの使用方法は次のようになります。
var x = "Hello";
var y = "H";
// doing concat to avoid string interring
AreSame(x, y+"ello");
はい、文字列は同等です。はい、 もT
同等ですstring
。しかし、ジェネリックは制約がないため、は==
オブジェクトの にバインドされます。したがって、明示的なパラメータを持つ同じコードが を返す場合でも、これは を返します。==
false
string
true