Question

Tout en essayant de vérifier à moi-même, que C # Equals pour IEnumerables est une référence égale, j'ai trouvé quelque chose de bizarre. Avec la configuration suivante dans NUnit

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?

Edit: Merci pour les réponses. Je viens de lire la documentation pour NUnit, et il dit la même chose, que AreEqual et AreNotEqual avec le test de recouvrement pour l'égalité de chaque élément de la collection. Je suppose que je suis coincé avec l'idée que AreEqual et AreNotEqual était juste en utilisant Equals plaine.

Était-ce utile?

La solution

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

Assert.AreNotEqual est un peu plus intelligent que cela. Il est conçu pour des fins de débogage, contrairement à la méthode Equals, il compare en fait les séquences produites 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, comme le retour true lorsque les deux paramètres sont numériquement identiques mais différents types de valeurs (par exemple short et long).

L'espoir qui aide.

Autres conseils

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

D'abord dans 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 elles sont, itérer et les comparer si les articles sont les mêmes et dans le même ordre.

Cependant, dans le type de T IEnumerable est plus complexe que la chaîne ou ValueType dans MbUnit AssertNotEqaual (a, b) ne manquera 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top