Вам действительно нужно реализовать переопределения для реализаций object.Equals и object.GetHashCode.
По сути, реализация IEquatable (из T) .Equals сама по себе будет работать только до тех пор, пока вызывающая программа УЗНАЕТ вызывать IEquatable (из T) .Equals вместо обычного object.Equals.
Подумайте, есть ли у вас ArrayList of Cars, и проверьте, содержит ли список (myCar), где Марка и Модель myCar такие же, как и у автомобиля в ArrayList ... но тот, который в ArrayList, на самом деле не является точным тот же экземпляр. Содержит вернул бы ложь.
Еще хуже, если у вас есть Hashtable или Dictionary, который использует GetHashCode для определения места хранения записей, равенство никогда не сработает, потому что две машины с одинаковыми марками и моделями будут возвращать разные значения для GetHashCode ()
По сути, все сводится к тому, что вы добавляете в машину следующие реализации:
Public Overrides Overloads Function Equals(obj As Object) As Boolean
Return TypeOf obj Is Car AndAlso Equals(DirectCast(obj, Car))
End Function
Public Overrides Function GetHashCode() As Int32
Dim hash As Int32 = 179 ' or something intelligent
hash = hash * 27 + Make.GetHashCode()
hash = hash * 27 + Model.GetHashCode()
Return hash
End Function
Итак, у меня вопрос: зачем вообще реализовывать IEquatable? Почему бы просто не переопределить Equals и GetHashCode?