У меня есть класс PagedModel, который реализует IEnumerable, чтобы просто вернуть ModelData, игнорируя данные подкачки. Я также переопределил Equals и GetHashCode, чтобы сравнить два объекта PagedModel по их параметрам ModelData, PageNumber и TotalPages и PageSize.Assert.AreEqual не использует мои переопределения .Equals в реализации IEnumerable.
Вот проблема
Dim p1 As New PagedModel() With {
.PageNumber = 1,
.PageSize = 10,
.TotalPages = 10,
.ModelData = GetModelData()
}
Dim p2 As New PagedModel() With {
.PageNumber = 1,
.PageSize = 10,
.TotalPages = 10,
.ModelData = GetModelData()
}
p1.Equals(p2) =====> True
Assert.AreEqual(p1, p2) ======> False!
Похоже, NUnit называет это внутренний EnumerableEqual способ сравнить мой PagedModel вместо того, чтобы использовать Равно методы, которые я обеспечен! Есть ли способ переопределить это поведение или мне нужно написать настраиваемое утверждение.
Этот ответ заключается в том, что по существу в вашей реализации вам необходимо явно реализовать IEquatable .Equals ... см. Http://stackoverflow.com/questions/1577149/explicit-interface-implementation-in-vb-net –
Jay
Нет, реализация IEquatable не достаточно. Реализация GetHashCode так же важна. Также важно понять, что IEnumerable возвращается к использованию Equals (object), если вы не реализуете IEquatable (см. Цитату в моем сообщении), поэтому делать это не обязательно. –
csauve
Я сказал, что явным образом реализую IEquatable.Equals, который не должен позволять отмену по умолчанию, потому что метод будет переопределен, и явная реализация вызовет указанный метод ... – Jay