在尝试向自己验证 C# Equals for IEnumerables 是一个引用 equals 时,我发现了一些奇怪的东西。在 NUnit 中进行以下设置
var a = (IEnumerable<string>)(new[] { "one", "two" });
var b = (IEnumerable<string>)(new[] { "one", "two" });
这次测试
Assert.IsFalse(a.Equals(b));
通过,而这个测试
Assert.AreNotEqual(a, b);
没有。有人能解释一下为什么吗?
编辑:感谢您的回答。我刚刚阅读了 NUnit 的文档,它说了同样的事情,即带有集合的 AreEqual 和 AreNotEqual 测试集合中每个元素的相等性。我想我一直坚持这样一个观念:AreEqual 和 AreNotEqual 只是使用普通的 Equals。
致电给a.Equals(b)
回报false
因为 a 和 b 不是相同的对象(尽管它们当然是相同的枚举)。这Equals
方法,除非被重写,否则会自动通过对象的引用来比较对象,这就是本例中发生的情况。
Assert.AreNotEqual http://msdn.microsoft.com/en-us/library/ms243457.aspx比这个聪明一点。它是为调试目的而设计的,与Equals
方法,因此它实际上比较两个枚举产生的序列,因为它识别IEnumerable<T>
作为一种特殊类型。您还应该注意到它还做了其他有趣的事情,例如返回true
当两个参数在数值上相同但值类型不同时(例如short
and long
).
希望有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)