Сегодня я столкнулся с этой ситуацией. У меня есть объект, который я тестирую для равенства; метод Create() возвращает подкласс класса MyObject.
MyObject a = MyObject.Create();
MyObject b = MyObject.Create();
a == b; // is false
a.Equals(b); // is true
Примечание. Я также переопределил Equals() в реализации подкласса, который выполняет очень базовую проверку, чтобы проверить, является ли переданный объект нулевым и относится к типу подкласса. Если оба этих условия выполнены, объекты считаются равными.
Другая странная вещь: мой набор unit test выполняет некоторые тесты, похожие на
Assert.AreEqual(MyObject.Create(), MyObject.Create()); // Green bar
и ожидаемый результат наблюдается. Поэтому я предполагаю, что NUnit использует a.Equals(b) под обложками, а не a == b, как я предполагал.
Боковое примечание: Я программирую в формате .NET и Java, поэтому я мог бы смешать мои ожидания/предположения здесь. Я думал, однако, что a == b работал более последовательно в .NET, чем в Java, где вам часто приходится использовать equals() для проверки равенства.
UPDATE. Здесь выполняется реализация Equals():
public override bool Equals(object obj) {
return obj != null && obj is MyObjectSubclass;
}