我想使用我的接口协变(接口必须协变),但编译器给我错误c#编译错误:参数必须是输入安全的。无效的方差。类型参数'T'必须在'Expression'上始终有效这是我的代码:
interface IRepository<out T> where T : BaseEntity
{
IEnumerable<T> Find(Expression<Func<T, bool>> predicate);
T FindById(Guid id);
}
您声明T
为协变(使用out
关键字),但您不能接受协变参数:
通常,协变类型参数可以用作返回类型的,并且逆变类型参数可以用作参数类型。对于接口,协变类型参数可以是用作接口方法的返回类型,并且是逆变的类型参数可以用作接口的参数类型方法。
Func<T, bool>
接受一个T
参数,返回一个违反此规则的bool
。您可以将其标记为逆变,但在下一个函数中返回T
。
你可以尝试通过使用两个类型参数(一个协变和一个逆变)来克服它,就像:
interface IRepository<out T, in U> where T : BaseEntity
where U : BaseEntity
{
IEnumerable<T> Find(Expression<Func<U, bool>> predicate);
T FindById(Guid id);
}
我很怀疑这是你在找什么,我不确定它是否会编译/工作,但它可能会有所帮助。