为什么 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.Equals
的 x
和 y
(即使他们将其作为参考比较),给定 var tuple1 = (x, y); var tuple2 = (x, y);
,tuple1.Equals(tuple2)
是 true
.但是 tuple1 == tuple2
,如果实现,应该等同于 x == x && y == y
,如果实现的话。后者 not 总是正确的。具体来说,如果 x
或 y
为 double.NaN
,则为假。这就是为什么 a pull request adding an operator ==
到 ValueTuple
被拒绝的原因。
在编译器中实现 ==
,只有当元组的元素支持通过 ==
进行比较时它才会起作用,是 an open proposal for the C# language,只是还没有实现.没有太多 activity,现在似乎没有理由不实施它,但它的优先级不高。
考虑以下代码片段:
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.Equals
的 x
和 y
(即使他们将其作为参考比较),给定 var tuple1 = (x, y); var tuple2 = (x, y);
,tuple1.Equals(tuple2)
是 true
.但是 tuple1 == tuple2
,如果实现,应该等同于 x == x && y == y
,如果实现的话。后者 not 总是正确的。具体来说,如果 x
或 y
为 double.NaN
,则为假。这就是为什么 a pull request adding an operator ==
到 ValueTuple
被拒绝的原因。
在编译器中实现 ==
,只有当元组的元素支持通过 ==
进行比较时它才会起作用,是 an open proposal for the C# language,只是还没有实现.没有太多 activity,现在似乎没有理由不实施它,但它的优先级不高。