元组实现

Tuples implementation

抱歉,如果重复。我找不到关于那件事的完整解释。 而且 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)的重载。

谢谢。

查看 documentation,您可以看到:

  • GetHashCode 被覆盖,尽管没有清楚地记录细节。 (例如,对于所有实例,可能 return 0。)
  • Equals 以一种有据可查的方式被覆盖,委托给组件类型的相等比较器。
  • == 运算符 重载 - 所以是的,它将执行常规引用身份比较

虽然没有明确记录,但编译时组件类型必须相等,而不仅仅是执行时组件类型.例如:

var t1 = new Tuple<object, object>("foo", "bar");
var t2 = new Tuple<string, string>("foo", "bar");
Console.WriteLine(t1.Equals(t2)); // False