タプル == 混乱 質問する

タプル == 混乱 質問する

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。しかし、ジェネリックは制約がないため、は==オブジェクトの にバインドされます。したがって、明示的なパラメータを持つ同じコードが を返す場合でも、これは を返します。==falsestringtrue

おすすめ記事