yo2*_*011 6 c# covariance contravariance
我想共同使用我的接口(接口必须是共变体)但编译器给我错误c#编译器错误: - '参数必须输入安全.方差无效.类型参数'T'必须在'Expression'上不变有效这是我的代码:
interface IRepository<out T> where T : BaseEntity
{
IEnumerable<T> Find(Expression<Func<T, bool>> predicate);
T FindById(Guid id);
}
Run Code Online (Sandbox Code Playgroud)
您声明T为covariant(使用out关键字)但您不能采用协变参数:
通常,协变类型参数可以用作委托的返回类型,逆变类型参数可以用作参数类型.对于接口,协变类型参数可以用作接口方法的返回类型,逆变类型参数可以用作接口方法的参数类型.
Func<T, bool>接受一个T参数并返回bool违反此规则.您可以将其标记为逆变,但T在下一个函数中返回a .
您可以通过采用两个类型参数(一个协变量和一个逆变量)来尝试击败它,例如:
interface IRepository<out T, in U> where T : BaseEntity
where U : BaseEntity
{
IEnumerable<T> Find(Expression<Func<U, bool>> predicate);
T FindById(Guid id);
}
Run Code Online (Sandbox Code Playgroud)
我非常怀疑它在寻找什么,我不确定它是否会编译/工作,但它可能有所帮助.