我正在阅读a MSDN article中的方法CollectionAssert.AreEquivalent
,并根据MSDN:
如果两个集合具有相同数量的相同元素,则它们是等效的,但是以任何顺序排列。如果元素的值相等,则元素相等,而不是它们引用相同的对象。
我在Visual Studio中尝试了以下代码:
var first = new TradeData { ID = "A", MarketPrice = 0 };
var mockFir = new TradeData { ID = "A", MarketPrice = 0 };
var collection = new List<TradeData> { first };
var mockCollection = new List<TradeData> { mockFir };
CollectionAssert.AreEquivalent(collection, mockCollection);
但我有一个例外:
CollectionAssert.AreEquivalent失败
所以,我的问题是:当他们说“元素如果它们的值相等而不是它们引用相同的对象”时,MSDN究竟是什么意思?
答案 0 :(得分:5)
因为TradeData
类没有覆盖object.Equals
,所以基本实现接管,它通过引用比较两个对象。虽然first
和mockFir
包含相同的值,但它们不是同一个对象,因此它们不被视为相等。如果您在Equals
课程中覆盖TradeData
,则您的示例将有效。
答案 1 :(得分:0)
&#34;如果元素的值相等,则元素相等,而不是如果它们引用相同的对象&#34;
这意味着CollectionAssert.AreEquivalent使用Object.equals而不是Object.ReferenceEquals。根据Object.Equals的Object类型和实现,值将(而不是#34; can&#34;)用于比较。
Object.Equals对于两种对象类型(释义)具有以下默认行为:
上述代码示例中的断言失败,因为您创建了要在两个列表中插入的不同对象。 AreEquivalent使用Object.Equals方法比较对象。仅当指向同一对象时,equals方法的默认实现才会对REFER类型对象返回true。 要比较这些对象的实际值,您需要覆盖TradeData的equals方法。
对于CollectionAssert.AreEqual,有另一种方法可以使用比较器,但对于CollectionAssert.AreEquivalent则不然。 https://msdn.microsoft.com/en-us/library/ms243753.aspx