Как я могу выполнить это простое сравнение на равенство? - PullRequest
0 голосов
/ 15 февраля 2012

У меня есть следующий код:

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 Ответ

1 голос
/ 15 февраля 2012

Хотя это может показаться интуитивно понятным, операторы (==, <, > и т. Д.) Не имеют ничего общего с такими интерфейсами, как IComparable, IEquatable и т. Д. К сожалению, операторы не могут бытьприменяется к универсальным типам.

В отличие от функций, подобных Equals, операторы являются статическими и, следовательно, не полиморфными.Поскольку невозможно получить доступ к статическим членам универсальных типов, операторы недоступны.

...