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

请考虑以下代码段:

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所有xy (即使它们将它作为参考比较),给定var tuple1 = (x, y); var tuple2 = (x, y); var tuple1 = (x, y); var tuple2 = (x, y);tuple1.Equals(tuple2)true 。 但是tuple1 == tuple2 ,如果实现,应该等于x == x && y == y ,如果实现的话。 后者并非总是如此。 具体来说,如果xydouble.NaN false double.NaN 。 这就是为什么拒绝向ValueTuple 添加operator ==的pull请求的原因。

在编译器中实现== ,只有当元组的元素支持通过==进行比较时它才有效,这是编译器的开放提议 ,但还没有实现。 没有太多的活动,现在似乎没有理由为什么它不会被实施,但它根本没有高优先级。