考虑以下代码片段:
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 方法,但没有实现双等于运算符?
The ==
由于需求冲突,运算符未在库中实现。对全部x
and y
正确实施object.Equals
(即使他们将其作为参考比较),给定var tuple1 = (x, y); var tuple2 = (x, y);
, tuple1.Equals(tuple2)
is true
. But tuple1 == tuple2
,如果实施的话,应该相当于x == x && y == y
,如果实施的话再次。后者是not永远正确。具体来说,如果x
or y
is double.NaN
。这就是为什么添加一个拉取请求operator == https://github.com/dotnet/corefx/pull/10417 to ValueTuple
被拒绝。
实施==
在编译器中,只有当元组的元素支持通过以下方式进行比较时,它才会起作用==
, is C# 语言的公开提案 https://github.com/dotnet/csharplang/issues/190,但还没有实施。没有太多的活动,目前似乎没有理由不实施它,但它根本没有很高的优先级。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)