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 回答