为什么C#7值元组实现了Equals方法而不是double Equals操作符?

为什么C#7值元组实现了Equals方法而不是double Equals操作符?,c#,.net,tuples,c#-7.0,C#,.net,Tuples,C# 7.0,考虑以下代码段: var tuple1 = (7, "foo"); var tuple2 = (7, "foo"); var tuple3 = (42, "bar"); Assert.That(tuple1.Equals(tuple2), Is.True); //This passes Assert.That(tuple1.Equals(tuple3), Is.False); //This passes Assert.That(tuple1 == tuple2, Is.True);

考虑以下代码段:

var tuple1 = (7, "foo");
var tuple2 = (7, "foo");
var tuple3 = (42, "bar");

Assert.That(tuple1.Equals(tuple2), Is.True);    //This passes
Assert.That(tuple1.Equals(tuple3), Is.False);   //This passes

Assert.That(tuple1 == tuple2, Is.True);         //This does not compile
前两个断言通过。第三个没有编译


为什么ValueTuple实现了自定义的Equals方法而没有实现double Equals操作符?

由于需求冲突,库中没有实现
=
操作符。对于正确实现
object.Equals的所有
x
y
(即使它们将其作为参考比较),给定
var tuple1=(x,y);var tuple2=(x,y)
tuple1.Equals(tuple2)
true
。但是
tuple1==tuple2
,如果实现,应该等同于
x==x&&y==y
,如果实现的话。后者并不总是正确的。具体来说,如果
x
y
double.NaN
,则为false。这就是拒绝使用to
ValueTuple
的原因


在编译器中实现
==
,只有当元组的元素支持通过
==
进行比较时,它才会起作用,但是还没有实现。活动不多,目前似乎没有理由不实施,但它并没有很高的优先级。

我投票将这个问题作为主题外的问题来结束,因为问堆栈溢出为什么一种语言/工具/框架支持或不支持某个功能是主题外的。@ErikPhilips:虽然我很欣赏这种叫喊,但这是一个罕见的“为什么不支持?”问题,实际上是相当有意义的。有人费尽心思去实现Equals,然后实现==来简单地调用Equals的成本是微不足道的。C#/.NET实现相等的方式有些奇怪,而且容易出错。在一个设计更好的系统中,实现
==
Equals
IComparable
等之间没有任何区别,但不幸的是确实存在。@EricLippert欢迎您。我已经用过很多次了。许多开发人员不了解构建一个数百万人(如果不是数十亿人)使用的框架的真正成本,以及正确使用该框架的相关成本在我写这篇评论时,它确实(现在)起了作用:“它不符合既定惯例”并没有阻止Roslyn团队使
ValueTuple
structs可变,因此Neil Grafter的论点相当弱。除此之外,这是一个正确的答案,因为它解释了决策背后的“逻辑”。谢谢!指向该pull请求的链接正是我一直在寻找的解释,但我找不到。由于选项2“逐点相等”似乎很合理,但需要语言支持,因此将元组功能的引入推迟到实现之前是有意义的。@AluanHaddad为什么有意义?现在实现的是这样一种方式,
=
可以在不破坏任何东西的情况下添加。@hvd无疑是正确的,但对我来说,很不幸的是,一个人的概念模型首先必须适应这些运算符可能意外的缺失,然后再适应以后的引入。我的感觉被这样一种印象所扭曲:元组并没有提供那么多的价值。