原因上的Equals()原因可能会返回false

时间:2017-11-06 17:02:57

标签: c#

我有一些代码想要使用元组作为字典的关键字,但是我在解锁密钥时遇到了问题。

Dictionary<Tuple<string, MyClass>, MyClass> Map = new Dictionary<Tuple<string, MyClass>, MyClass>
{
  { Tuple.Create(s1, new MyClass { value = v1 }), new MyClass { value = r1 } }
}

Tuple<string, MyClass> key = Tuple.Create(s, o);
foreach (Tuple<string, MyClass> t in Map.Keys)
{
  if (t.GetType() == key.GetType()
    && t.Item1.Equals(key.Item1) && t.Item2.Equals(key.Item2)
    && t.Item1.GetHashCode() == key.Item1.GetHashCode() && t.Item2.GetHashCode() == key.Item2.GetHashCode())
  {
    bool test2 = t.Equals(key); // False?
    bool test3 = t.GetHashCode() == key.GetHashCode(); // True
  }
}
  • t和key都是System.Tuple&lt;类型的。 string,domain.MyClass&gt;
  • 个别值应该被视为相等,因为我在MyClass中实现了Equals方法 - 这也在if语句中进行了检查
  • 在这种情况下,我希望test2为True,因为我能找到的任何文档告诉我两个组件是否应该是相同类型,并且它们应该是等于(通过覆盖Equals来确保)

1 个答案:

答案 0 :(得分:0)

这是平等所必需的:

t.Item2.Equals(key.Item2)

所以它取决于T。如果T是值类型,如果值相等,则返回true。

如果T是引用类型,那么只有当Item2引用同一个实例或T overrides等于`时才会返回true,以便可以将不同的实例等同起来。< / p>

在此之前,您需要在==的两个实例之间检查T。这可能是多余的,但出于同样的原因,它也会失败。除非您还覆盖==运算符,否则它将检查引用类型以获取引用相等。

我首先删除==支票 - 只需使用Equals - 然后确保您可以期望Equals在您预期时返回true。这可以通过确保T覆盖Equals来提供您期望的行为,或者确保两者都是同一个实例。