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

时间:2017-02-10 22:59:42

标签: 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);         //This does not compile

前两个断言通过。第三个不编译。

为什么ValueTuple实现了自定义的Equals方法但没有实现double equals运算符?

1 个答案:

答案 0 :(得分:36)

由于需求冲突,库中未实现==运算符。对于正确实施x的所有yobject.Equals(即使他们将其作为参考比较),给定var tuple1 = (x, y); var tuple2 = (x, y);tuple1.Equals(tuple2)为{{1} }。但true如果已实施,则应等同于tuple1 == tuple2。后者总是如此。具体而言,如果x == x && y == yxy,则为假。这就是a pull request adding an operator ==double.NaN被拒绝的原因。

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