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

Jon*_*ner 21 .net c# 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
Run Code Online (Sandbox Code Playgroud)

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

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

小智 37

==由于需求冲突,运算符未在库中实现.对于所有xy正确实现object.Equals(即使他们将其作为参考比较),给定var tuple1 = (x, y); var tuple2 = (x, y);,tuple1.Equals(tuple2)true.但是tuple1 == tuple2,如果实施,应该相当于x == x && y == y,如果实施的话.后者并非总是如此.具体地讲,它是假的,如果xydouble.NaN.这就是为什么添加operator == to 的pull请求ValueTuple被拒绝的原因.

==在编译器中实现,只有在元组的元素支持比较时才能工作==,这是编译器的开放提议,但还没有实现.没有太多的活动,现在似乎没有理由为什么它不会被实施,但它根本没有高优先级.

  • "它与既定惯例不一致"并没有阻止Roslyn团队使'ValueTuple`结构变得可变,所以这是Neil Grafter的一个相当弱的论点.除此之外,这是一个答案,因为它解释了决策背后的"逻辑". (3认同)