驚くべきタプルの(不)等価性 質問する

驚くべきタプルの(不)等価性 質問する

Tuple今日まで、.NETクラスについては、その実装をEquals()その内容に委任し、それらを「値によって」同等視して比較できると理解していました。

その後、このテストがやって来て、私は馬鹿にされました。

[TestMethod]
public void EquateTwoTuplesWithSameContent()
{
    var t1 = Tuple.Create("S");
    var t2 = Tuple.Create((object)t1.Item1);
    Assert.IsTrue(t1.Equals(t2)); // Boom!
}

MSDN ドキュメントやさまざまなブログを読んでいると、さらに疑問が湧いてきました。私が収集した情報によると、両方のインスタンスが同じオブジェクトをラップしている可能性があるという事実 (ボックス化または型キャスト - すべて同じ) に関係なく、Tuple<object>と は常に等しくないと見なされるようです。Tuple<TWhatever>

これは本当にTuplesそうするべきなのでしょうか?構造的適合性は実際には追加これまで私が解釈してきた緩和ではなく、平等に対する制約なのでしょうか?

もしそうなら、上記の単体テストの期待に応えるために使用できる BCL の他のものはありますか?

よろしくお願いします!

ベストアンサー1

タプルでは、​​オブジェクトが「等しい」と見なされるためには、次の条件が満たされている必要があります。

  • 現在のオブジェクトと同じ数のジェネリック パラメータを持つ Tuple オブジェクトである必要があります。
  • これらのジェネリック パラメータはそれぞれ、他のパラメータと同じ型である必要があります。
  • タプルの各メンバーは、他の対応するメンバーと同じ値を持つ必要があります。

したがって、 a はTuple<object>a とは異なるジェネリック パラメーターを持つためTuple<string>、オブジェクトが実際には厳密に型指定された と同じ値の文字列への参照であっても、それらは等しくありませんTuple<string>

おすすめ記事