Assert.Equals实现IEquatable(T)的两个对象不使用equals方法

时间:2011-09-06 13:26:02

标签: .net mstest

我有一个实现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)的用途是什么?

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

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

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