【问题标题】:Why do C# 7 ValueTuples implement the Equals method but not the double equals operator?为什么 C# 7 ValueTuples 实现 Equals 方法而不实现双等号运算符?
【发布时间】:2017-06-29 10:20:12
【问题描述】:

考虑以下代码sn-p:

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 方法,却没有实现双等号运算符?

【问题讨论】:

标签: c# .net tuples c#-7.0


【解决方案1】:

== 运算符未在库中实现,因为需求冲突。对于所有正确实现object.Equalsxy(即使他们将其作为参考比较),给定var tuple1 = (x, y); var tuple2 = (x, y);tuple1.Equals(tuple2)true。但是tuple1 == tuple2,如果实现了,应该等同于x == x && y == y,如果实现了。后者总是正确的。具体来说,如果xydouble.NaN,则为假。这就是a pull request adding an operator ==ValueTuple 被拒绝的原因。

在编译器中实现==,只有当元组的元素支持通过== 进行比较时,它才会工作,是an open proposal for the compiler,但还没有实现。没有太多活动,目前似乎没有理由不实施它,但它根本没有高优先级。

【讨论】:

  • “它与既定约定不一致”并没有阻止 Roslyn 团队使 ValueTuple 结构可变,所以这是 Neil Grafter 的一个相当薄弱的论点。除此之外,这是一个很好的答案,因为它解释了决定背后的“逻辑”。
  • 谢谢!该拉取请求的链接正是我正在寻找但无法找到的解释。
  • 由于选项 2,逐点相等,看起来很合理,但需要语言支持,因此延迟引入元组特性直到实现它是有意义的。
  • @AluanHaddad 为什么这样有意义?现在实现的方式是在以后添加== 而不会破坏任何内容。
  • @hvd 无疑是正确的,但对我来说似乎很不幸的是,一个人的概念模型首先必须适应这些运算符的可能意外缺席,然后再适应它们以后的引入。我的感觉被元组没有提供那么多价值的印象所扭曲。
猜你喜欢
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 2014-03-19
  • 2016-03-24
  • 2011-03-10
  • 1970-01-01
相关资源
最近更新 更多