2014-09-24 2 views
1

Итак, у меня есть интерфейс для объектов, которые требуют, чтобы они отображали свой идентификатор .IEquatable <'1> на интерфейсе

public interface IEntity<TIdentity> { 
    public TIdentity Id { get; } 
} 

Теперь мне нужно, чтобы иметь возможность сравнить два объекта, которые друг с другом, но я не могу полагаться на реализации по умолчанию Equals и GetHashCode, потому что организации должны быть сравнимы по их идентичности, а не общая подпись , Поскольку каждый класс, который реализует IEntity<'1>, должен быть сопоставим, я думал об объявлении IEquatable<'1> непосредственно на интерфейсе сущности.

ну .. это не работает. Когда я объявляю IEquatable<'1> на IEntity<'1> интерфейс навязывает реализации классов для реализации следующих действий:

public bool Equals(IEntity<'1> other) 

вместо

public bool Equals(TypeImplementingIEntity other) 

Так после вызова Equals на двух лиц, среда выполнения ссылается на Equals(object obj), так как тип аргумент по методу, предоставленному IEquatable<'1>, не соответствует реальному типу! Что?

ответ

2

Должно работать. Equals(IEntity<TIdentity>) должны иметь приоритет над Equals(object)

Вы должны переопределить Equals(object) в любом случае:

public override bool Equals(object other) { 
    return Equals(other as IEntity<TIdentity>); 
} 
+0

Согласно [это] (http://stackoverflow.com/questions/371328/why-is-it-important-to- override-gethashcode-when-equals-method-is-overridden), важно также переопределить 'GetHashCode()'. –

+0

Да, вы должны, но это не тот вопрос, о котором я говорил, поэтому я не упоминал об этом. –

Смежные вопросы