Assert.Equals из двух объектов, реализующих IEquatable (T), не использует метод equals - PullRequest
7 голосов
/ 06 сентября 2011

У меня есть пользовательский тип Type, который реализует IEquatable (Type). Затем я открываю два экземпляра типа, ни один из которых не является пустым

Assert.IsTrue(obj1.equals(obj2)) //Success
Assert.AreEqual(obj1, obj2) //False
Assert.AreEqual(Type)(obj1, obj2) //False

Первый попадает в мои равные, второй - в ToString () Есть предложения?

обновление
некоторый код для иллюстрации: http://pastebin.com/1uecrfeW

больше обновлений
Если мне нужно переопределить базовые равенства, даже если доступно лучшее (универсальное) равенство, то какая польза от реализации IEquals (T)?

Ответы [ 2 ]

5 голосов
/ 06 сентября 2011

Я предполагаю, что на самом деле поражает Equals(object) вместо Equals(T). Если вы не переопределили Equals(object), возможно, оно не соответствует утверждению, которое затем использует ToString для создания полезного сообщения об ошибке.

Если бы вы могли показать короткую, но полную программу, которая демонстрирует проблему (включая метод Assert, который вы вызываете - NUnit? Что-то еще?), Это помогло бы.

2 голосов
/ 06 сентября 2011

IIRC Assert.AreEqual не является универсальным, поэтому применяется только object.Equals; попробуйте проверить переопределение неуниверсального объекта. Уравнения.

В дополнение к неудобству вызова обобщенного метода с помощью отражения, объекты также могут реализовывать кратные IEquatable<T> (для разных T). Так что неуниверсальная версия имеет здесь смысл, ИМО.

...