【问题标题】:Unexpected Tuple inequality意外的元组不等式
【发布时间】:2021-05-18 01:29:15
【问题描述】:

我正在使用 .net core 3.1 / C# 8.0。我有两个元组,我希望它们具有相等的值,但是运行时返回不等式。我的期望有什么问题?

Tuple<decimal, double> firstTuple;
Tuple<decimal, double> secondTuple;

测试:

bool tuplesEqualInValue = (firstTuple == secondTuple);

屏幕截图显示firstTuple 和secondTuple 的值对于每个项目都具有相同的值。然而第一个测试返回false。

文档和其他 SO 帖子暗示我测试应该返回 true: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-7.3/tuple-equality

https://stackoverflow.com/a/44194321/10340388

https://stackoverflow.com/a/5069777/10340388

【问题讨论】:

  • 刚刚测试过bool secondTestTuplesEqualInValue = firstTuple.Equals(secondTuple);,它返回true。
  • 刚刚查看了 Tuple.cs 并没有发现任何引入的运算符,我真的不明白为什么微软声明它支持 == 运算符以实现元组值相等。
  • @AlexeyRumyantsev 元组类型特指ValueTuple,确实具有该覆盖
  • Charlieface,谢谢,现在对我来说有意义了。
  • 简而言之,ValueTuples 具有预期的行为,是新的热点

标签: c# c#-8.0


【解决方案1】:

你的前两个链接谈到System.ValueTuple,这不是你在这里使用的(System.Tuple),所以它们与这个问题无关。不过,如果您使用的是支持它们的 C# 版本,请考虑改用 ValueTuple。 Here's a start.

第三个链接谈到System.Tuple 的相等性使用.Equals,但您使用的是==。如果您使用.Equals 比较它们,您会发现它们确实相等:

var firstTuple = Tuple.Create(217930.7650m, 670.556);
var secondTuple = Tuple.Create(217930.7650m, 670.556);
Console.WriteLine(firstTuple.Equals(secondTuple)); // True

使用== 不起作用,因为与string 不同,System.Tuple 不会重载== 运算符,因此使用比较引用的默认行为。 (string overloads ==)

【讨论】:

  • 谢谢,现在我知道Tuple 是一个引用类型,它返回false 是非常有意义的。令人沮丧的是,MS 文档并没有表明它指的是ValueTuple 而不是Tuple...
  • @Superman.Lopez Yes it does,您链接的页面实际上不是文档,它是团队的提议
  • 确实,我现在才注意到。这是我搜索的第一批结果之一。我不够小心。
猜你喜欢
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 2012-09-23
  • 2019-05-15
  • 1970-01-01
  • 2017-09-02
  • 2018-08-27
  • 1970-01-01
相关资源
最近更新 更多