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

2023-12-27

考虑以下代码片段:

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(使用前将#替换为@)

为什么 C# 7 ValueTuples 实现 Equals 方法而不是双等于运算符? 的相关文章

随机推荐