![](/img/trans.png)
[英]Why does Assert.IsInstanceOfType(0.GetType(), typeof(int)) fail?
[英]Why does this Assert fail?
IEnumerable<ReportReceipt> expected = new List<ReportReceipt>()
{
new ReportReceipt("fileName1","Hash1","some comments1")
};
IEnumerable<ReportReceipt> actual = new List<ReportReceipt>()
{
new ReportReceipt("fileName1","Hash1","some comments1")
};
Assert.IsTrue(expected.SequenceEqual(actual));
我正在使用VS 2008运行MSTest。
SequenceEqual通过使用默认的相等比较器来比较元素来确定两个序列是否相等。
如果您没有在类中重载Equals和GetHashCode,则回退对象相等性检查将失败,因为序列包含两个不同的对象。
大概是因为ReportReceipt不会覆盖Equals
- 所以它只是比较引用,而且它们是不相等的。
适当地覆盖Equals
和GetHashCode
,它应该可以正常工作。
你为ReportReceipt重载了相等运算符吗? SequenceEqual方法是不是在内存中测试ReportReceipt的相等位置,而不是对象的内容? 覆盖Equals和GetHashCode应该可以解决您的问题。
在ReportReceipt中添加如下内容:
public override bool Equals(object obj)
{
if (obj == null || obj.GetType() != this.GetType)
return false;
ReportReceipt other = (ReportReceipt)obj;
return this.FileName.Equals(other.FileName)
&& this.Hash.Equals(other.Hash);
}
您正在比较两个不同的引用对象实例 - 因此,除非您在类型上实现Equals
以检查属性值而不是引用,否则它们将不相等。
为了简化这一过程,请使用CollectionAssert.AreEquivalent()
代替。
如果要使用自己的比较器来确定相等性,可以使用MSDN上描述的此方法的重载
基本上,您将传递IEqualityComparer<TSource>
作为参数,该参数将用于比较元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.