我想共同使用我的界面(界面必须是共变体),但编译器给我错误 c#编译错误: - '参数必须安全输入。方差无效。类型参数' T'必须在' Expression' 上无条件有效这是我的代码:
interface IRepository<out T> where T : BaseEntity
{
IEnumerable<T> Find(Expression<Func<T, bool>> predicate);
T FindById(Guid id);
}
答案 0 :(得分:7)
您将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);
}
我严重怀疑你在寻找什么,我不确定它是否会编译/工作,但它可能会有所帮助。