为什么 C# 7 ValueTuples 实现了 Equals 方法而不是双等于运算符?

Why do C# 7 ValueTuples implement the Equals method but not the double equals operator?

考虑以下代码片段:

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 方法而不实现双等号运算符?

由于需求冲突,库中未实现 == 运算符。对于所有正确实现 object.Equalsxy(即使他们将其作为参考比较),给定 var tuple1 = (x, y); var tuple2 = (x, y);tuple1.Equals(tuple2)true.但是 tuple1 == tuple2,如果实现,应该等同于 x == x && y == y,如果实现的话。后者 not 总是正确的。具体来说,如果 xydouble.NaN,则为假。这就是为什么 a pull request adding an operator ==ValueTuple 被拒绝的原因。

在编译器中实现 ==,只有当元组的元素支持通过 == 进行比较时它才会起作用,是 an open proposal for the C# language,只是还没有实现.没有太多 activity,现在似乎没有理由不实施它,但它的优先级不高。