请考虑以下代码段:
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运算符?
答案 0 :(得分:36)
由于需求冲突,库中未实现==
运算符。对于正确实施x
的所有y
和object.Equals
(即使他们将其作为参考比较),给定var tuple1 = (x, y); var tuple2 = (x, y);
,tuple1.Equals(tuple2)
为{{1} }。但true
如果已实施,则应等同于tuple1 == tuple2
。后者不总是如此。具体而言,如果x == x && y == y
或x
为y
,则为假。这就是a pull request adding an operator ==
到double.NaN
被拒绝的原因。
在编译器中实现ValueTuple
,只有当元组的元素支持通过==
进行比较时,才能使用==
,但是还没有实现。没有太多的活动,现在似乎没有理由为什么它不会被实施,但它根本没有高优先级。