1

重複していたらごめんなさい。その件についての完全な説明は見つかりませんでした。そして、MSDNはいつものように曖昧です...

.Net タプルは、そのまま使用できる equals と GetHashCode の実装を提供しますか? (結果として == 演算子)

タプルがデフォルトですべてのアイテムを比較することを期待できますか、それともここに示されているように IEqualityComparer を提供する必要がありますnet-tuple-and-equals-performance ?

辞書のキーとして確実に適用できますか?

私は小さなテストを実行しました:

Tuple<DateTime, string, int> test3 = new Tuple<DateTime, string, int>(DateTime.Now.Date, "1", 1);
Tuple<DateTime, string, int> test4 = new Tuple<DateTime, string, int>(DateTime.Now.Date, "1", 1);

Console.WriteLine(test3 == test4);
Console.WriteLine(test3.Equals(test4));

Console.ReadKey();

結果は偽と真でした。equals は実装されていますが、演算子は実装されていないと思います。これは == 演算子が参照を比較するということですか? また、IEqualityComparer (フレームワーク バージョン 4) でオーバーロードが見つかりませんでした。

ありがとう。

4

1 に答える 1

3

ドキュメントを見ると、次のことがわかります。

  • GetHashCode詳細は明確に文書化されていませんが、オーバーライドされます。(たとえば、すべてのインスタンスに対して 0 を返すことができます。)
  • Equalsよく文書化された方法でオーバーライドされ、コンポーネント型の等値比較子に委譲されます。
  • ==演算子はオーバーロードされていません-はい、通常の参照識別比較を実行する必要があります

明確に文書化されていませんが、実行時のコンポーネントの型だけでなく、コンパイル時のコンポーネントの型も同じでなければなりません。たとえば、次のようになります。

var t1 = new Tuple<object, object>("foo", "bar");
var t2 = new Tuple<string, string>("foo", "bar");
Console.WriteLine(t1.Equals(t2)); // False
于 2016-02-02T10:56:42.033 に答える