.net 实现IEquatable(T)的两个对象的断言。等于';不要使用相等的方法

.net 实现IEquatable(T)的两个对象的断言。等于';不要使用相等的方法,.net,mstest,.net,Mstest,我有一个实现IEquatable(类型)的自定义类型。 然后我创建了两个该类型的实例,它们都不是空的 Assert.IsTrue(obj1.equals(obj2)) //Success Assert.AreEqual(obj1, obj2) //False Assert.AreEqual(Type)(obj1, obj2) //False 第一个命中我的对等项,第二个命中ToString() 有什么建议吗 更新 一些代码可以说明: 更多更新 如果我必须重写基本的equals,即使有更好的(通

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

Assert.IsTrue(obj1.equals(obj2)) //Success
Assert.AreEqual(obj1, obj2) //False
Assert.AreEqual(Type)(obj1, obj2) //False
第一个命中我的对等项,第二个命中ToString() 有什么建议吗

更新
一些代码可以说明:

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

我的猜测是它实际上击中了
equals(object)
而不是
equals(T)
。如果您没有重写
Equals(object)
,则可能是断言失败,然后使用
ToString
创建有用的失败消息


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

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


除了通过反射调用通用方法带来的不便之外,对象还可以实现多个
IEquatable
(针对不同的T)。因此,非通用版本在这里是有意义的,我想。

请阅读本文。一切都在Remarks中得到了澄清,您没有覆盖对象。Equals重新编辑-体裁版本通常由通用代码-List-of-t等使用。EqualityComparer-of-t也使用etc@borisCallens:正如我所想-您提供了
等于(句子)
,但没有
等于(对象)
。在C#中,如果不重写
Equals(object)
@boris,则无法重写
GetHashCode
,这将导致错误,即使存在泛型方法,泛型类型推断也取决于编译器对参数类型类型的查看,而不是值。变量类型是什么?注意:将它们更改为
dynamic
可能会修复它,因为“fix”的hacky值是我内联的,将它们更新为Type's@boris我不知道你说的那句话是什么意思。显示声明的代码将有助于assert.AreEqual(new Type(),new Type())@boris和does
Type:IEquatable