2009-04-25 15 views
5

En essayant de me vérifier, que C# est égal à IEnumerables est une référence égale, j'ai trouvé quelque chose d'étrange. Avec la configuration suivante NUnitC# Assert.AreNotEqual versus Equals

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

ce test

Assert.IsFalse(a.Equals(b)); 

passe, alors que ce test

Assert.AreNotEqual(a, b); 

ne fonctionne pas. Quelqu'un peut-il expliquer pourquoi?

Modifier: Merci pour les réponses. Je viens de lire la documentation pour NUnit, et ça dit la même chose, que AreEqual et AreNotEqual avec des tests de collections pour l'égalité de chaque élément de la collection. Je suppose que j'étais coincé avec la notion, que AreEqual et AreNotEqual utilisaient simplement Equals.

Répondre

9

L'appel à a.Equals(b) renvoie false car a et b ne sont pas les mêmes objets (bien qu'ils soient bien sûr des énumérations identiques). La méthode Equals, sauf substitution, compare automatiquement les objets par leur référence, ce qui se produit dans ce cas.

Assert.AreNotEqual est un peu plus intelligent que cela. Il est conçu pour le débogage, contrairement à la méthode Equals, donc il compare en fait les séquences générées par les deux énumérations, puisqu'il reconnaît IEnumerable<T> comme un type spécial. Vous devriez également remarquer qu'il fait d'autres choses intéressantes, telles que renvoyer true lorsque les deux paramètres sont numériquement identiques mais de types de valeur différents (par exemple short et long).

Espérons que cela aide.

1

Je n'ai pas regardé le code source de NUnit pour voir comment les gars de NUnit ont codé AreNotEqual. Cependant, je peux vous dire comment cela est fait pour MbUnit qui a le même comportement.

Premier AssertNotEqual (a, b) vérifie si les références sont égaux en exécutant le code comme ceci:

if (Object.ReferenceEquals(left, right)) 
     return true; 

Dans votre cas, il va à l'échec. Ensuite, il vérifie si les objets sont de type IEnumerable. Si c'est le cas, parcourez-les et comparez si les éléments sont identiques et dans le même ordre. Cependant, dans T type in IEnumerable est plus complexe que string ou ValueType dans MbUnit AssertNotEqaual (a, b) n'échouera pas.

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 
Questions connexes