Как я могу выполнить это простое сравнение на равенство?
У меня есть следующий код:
public abstract class RepositoryBase<T, TId> : IRepository<T, TId>
where T : class, IEntityWithTypedId<TId>
where TId : IEquatable<TId>, IComparable<TId>
{
public T FindById(TId id)
{
T entity;
using (this.Context) // This simply returns the NHibernate Session
{
var entities = from e in this.Context.Get()
// where e.Id.Equals(id)
where e.Id == id
select e;
entity = entities.FirstOrDefault();
}
return entity;
}
}
Если я использую where e.Id == id
оговорка, я получаю ошибку:
ошибка CS0019: оператор '==' не может быть применен к операндам типа 'TId' и 'TId'
ошибка, хотя я сказал компилятору, что TId
должен реализовать IEquatable
а также IComparable
Если я использую where e.Id.Equals(id)
предложение скомпилируется, но я получаю исключение NotSupported от NHibernate, когда он выполняет запрос на FirstOrDefault
линия.
Я знаю, что я должен что-то упустить в дизайне, но решение ускользало от меня на несколько дней.
1 ответ
Хотя это может показаться интуитивным, операторы (==
, <
, >
и т. д.) не имеют ничего общего с такими интерфейсами, как IComparable
, IEquatable
и т. д. К сожалению, операторы не могут применяться к универсальным типам.
В отличие от таких функций, как Equals
операторы являются статическими и, следовательно, не полиморфными. Поскольку невозможно получить доступ к статическим членам универсальных типов, операторы недоступны.