C#Assert.AreNotEqual与Equals

Bor*_*ris 5 c# nunit equals

在尝试验证自己时,对于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.

Nol*_*rin 9

a.Equals(b)返回的调用,false因为a和b不是相同的对象(尽管它们当然是相同的枚举).Equals除非被覆盖,否则该方法会自动通过引用来比较对象,这就是在这种情况下发生的情况.

Assert.AreNotEqual比这更聪明一点.它设计用于调试目的,与Equals方法不同,因此它实际上比较了两个枚举产生的序列,因为它识别IEnumerable<T>为特殊类型.您还应该注意到它会执行其他有趣的操作,例如true在两个参数在数值上相同但具有不同值类型(例如shortlong)时返回.

希望有所帮助.