我有以下代码:
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)
子句,代码将编译,但是当它在FirstOrDefault
行执行查询时,我从NHibernate得到一个NotSupported Exception。
我知道我必须在设计中遗漏一些东西,但解决方案已经让我好几天了。
答案 0 :(得分:1)
虽然看起来很直观,但是运营商(==
,<
,>
等)与IComparable
,IEquatable
等接口无关等等。遗憾的是,运算符不能应用于泛型类型。
与Equals
之类的函数不同,运算符是静态的,因此不是多态的。由于无法访问泛型类型的静态成员,因此无法访问运算符。