C#Assert.AreNotEqual与Equals

C#Assert.AreNotEqual与Equals,c#,nunit,equals,C#,Nunit,Equals,当我试图向自己证实IEnumerables的C#Equals是一个引用Equals时,我发现了一些奇怪的东西。使用NUnit中的以下设置 var a = (IEnumerable<string>)(new[] { "one", "two" }); var b = (IEnumerable<string>)(new[] { "one", "two" }); 通过,而此测试 Assert.AreNotEqual(a, b); 没有。有人能解释为什么吗 编辑:谢谢你的回答。

当我试图向自己证实IEnumerables的C#Equals是一个引用Equals时,我发现了一些奇怪的东西。使用NUnit中的以下设置

var a = (IEnumerable<string>)(new[] { "one", "two" });
var b = (IEnumerable<string>)(new[] { "one", "two" });
通过,而此测试

Assert.AreNotEqual(a, b);
没有。有人能解释为什么吗

编辑:谢谢你的回答。我刚刚阅读了NUnit的文档,它说了同样的事情,集合的相等性和不相等性测试集合中每个元素的相等性。我想我被这个概念所困扰,AreEqual和AreNotEqual只是使用普通的Equals。

调用
a.Equals(b)
返回
false
,因为a和b不是相同的对象(尽管它们当然是相同的枚举)。除非被重写,否则
Equals
方法会根据对象的引用自动比较对象,在本例中就是这样

比这聪明一点。它是为调试而设计的,与
Equals
方法不同,因此它实际上比较了两个枚举生成的序列,因为它将
IEnumerable
识别为一种特殊类型。您还应该注意到,它还做了其他有趣的事情,例如当两个参数的数值相同但值类型不同(例如
short
long
)时,返回
true


希望这能有所帮助。

我没有看NUnit的源代码来了解NUnit的人是如何编写AreNotEqual的。 但是,我可以告诉您,对于具有相同行为的MbUnit,它是如何实现的

AssertNotEqual(a,b)中的第一个通过执行如下代码检查引用是否相等:

    if (Object.ReferenceEquals(left, right))
        return true;
在你的情况下,它将失败。接下来检查对象是否为IEnumerable类型。如果是,则对其进行迭代,并比较项目是否相同以及顺序是否相同

然而,在T中,IEnumerable中的type比MbUnit AssertNotequal中的string或ValueType更复杂(a,b)不会失败

    var a = (IEnumerable<StringBuilder>)(new[] { new StringBuilder("one"), new StringBuilder("two") });
    var b = (IEnumerable<StringBuilder>)(new[] { new StringBuilder("one"), new StringBuilder("two") });

    Assert.IsFalse(a.Equals(b));  // Success
    Assert.AreNotEqual(a, b);     // Success
var a=(IEnumerable)(new[]{new StringBuilder(“一”),new StringBuilder(“两”)});
变量b=(IEnumerable)(新[]{new StringBuilder(“一”),新StringBuilder(“两”)});
Assert.IsFalse(a.Equals(b));//成功
Assert.AreNotEqual(a,b);//成功
    var a = (IEnumerable<StringBuilder>)(new[] { new StringBuilder("one"), new StringBuilder("two") });
    var b = (IEnumerable<StringBuilder>)(new[] { new StringBuilder("one"), new StringBuilder("two") });

    Assert.IsFalse(a.Equals(b));  // Success
    Assert.AreNotEqual(a, b);     // Success