在尝试验证自己时,对于IEnumerables的C#Equals是一个引用等于,我发现了一些奇怪的东西.在NUnit中进行以下设置
var a = (IEnumerable<string>)(new[] { "one", "two" });
var b = (IEnumerable<string>)(new[] { "one", "two" });
Run Code Online (Sandbox Code Playgroud)
这个测试
Assert.IsFalse(a.Equals(b));
Run Code Online (Sandbox Code Playgroud)
通过,而这个测试
Assert.AreNotEqual(a, b);
Run Code Online (Sandbox Code Playgroud)
没有.谁能解释为什么?
编辑:谢谢你的回答.我刚刚阅读了NUnit的文档,它说同样的事情,AreEqual和AreNotEqual with collections测试集合中每个元素的相等性.我想我坚持这个概念,AreEqual和AreNotEqual只是使用简单的Equals.
对a.Equals(b)
返回的调用,false
因为a和b不是相同的对象(尽管它们当然是相同的枚举).Equals
除非被覆盖,否则该方法会自动通过引用来比较对象,这就是在这种情况下发生的情况.
Assert.AreNotEqual
比这更聪明一点.它设计用于调试目的,与Equals
方法不同,因此它实际上比较了两个枚举产生的序列,因为它识别IEnumerable<T>
为特殊类型.您还应该注意到它会执行其他有趣的操作,例如true
在两个参数在数值上相同但具有不同值类型(例如short
和long
)时返回.
希望有所帮助.
归档时间: |
|
查看次数: |
2095 次 |
最近记录: |