【问题标题】:Assert.Equals of Two objects implementing IEquatable(T) doesn't use the equals method实现 IEquatable(T) 的两个对象的 Assert.Equals 不使用 equals 方法
【发布时间】:2011-09-06 21:49:04
【问题描述】:

我有一个实现 IEquatable(Type) 的自定义类型 Type。 然后我新建了两个该类型的实例,它们都不是 Null

Assert.IsTrue(obj1.equals(obj2)) //Success
Assert.AreEqual(obj1, obj2) //False
Assert.AreEqual(Type)(obj1, obj2) //False

第一个命中我的等号,第二个命中 ToString() 有什么建议吗?

更新
一些代码来说明:http://pastebin.com/1uecrfeW

更多更新
如果我必须重写基本等于,即使有更好的(通用)等于可用,那么实现 IEquals(T) 有什么用?

【问题讨论】:

  • 阅读此IEquatable。一切都在备注中澄清
  • 你没有覆盖Object.Equals
  • 重新编辑 - 流派版本通常由通用代码使用 - List-of-T 等。另外,由 EqualityComparer-of-T 等使用

标签: .net mstest


【解决方案1】:

我的猜测是它实际上点击Equals(object)而不是Equals(T)。如果您没有覆盖Equals(object),那么它可能会导致断言失败,然后使用ToString 创建有用的失败消息。

如果你能展示一个简短但完整的程序来演示问题(包括你正在调用的 Assert 方法 - NUnit?还有什么?),那会有所帮助。

【讨论】:

  • @borisCallens:正如我所想 - 你提供了Equals(Sentence),但没有提供Equals(object)。在 C# 中,如果不覆盖 Equals(object),则无法覆盖 GetHashCode
【解决方案2】:

IIRC Assert.AreEqual 是非泛型的,所以只有 object.Equals 适用;尝试检查非泛型 object.Equals 的覆盖。

除了通过反射调用泛型方法的不便之外,对象还可以实现multipleIEquatable<T>(针对不同的T)。所以非通用版本在这里是有意义的,IMO。

【讨论】:

  • @boris 即使有泛型方法,泛型类型推断也取决于编译器对 parameters 类型类型的视图——而不是值。变量类型是什么?注意:将它们更改为 dynamic 可能会修复它,因为“修复”的 hacky 值
  • 我将它们内联为 Type 的
  • @boris 我不知道你所说的那句话是什么意思。显示声明 then 的代码会有所帮助
  • Assert.AreEqual(new Type(), new Type())
  • @boris 和Type : IEquatable<Type>
猜你喜欢
  • 1970-01-01
  • 2011-12-06
  • 2011-09-11
  • 2016-04-24
  • 1970-01-01
  • 2016-05-25
  • 2021-03-05
  • 2011-04-26
  • 2012-11-24
相关资源
最近更新 更多