c#编译错误'参数必须输入安全.无效的方差.类型参数'必须在Expression

本文关键字:类型参数 Expression TDelegate 方差 安全 错误 编译 参数 输入 无效 | 更新日期: 2023-09-27 18:08:59

我想使用我的接口协变(接口必须协变),但编译器给我错误c#编译错误:参数必须是输入安全的。无效的方差。类型参数'T'必须在'Expression'上始终有效这是我的代码:

interface IRepository<out T> where T : BaseEntity
{
    IEnumerable<T> Find(Expression<Func<T, bool>> predicate);
    T FindById(Guid id);
}

c#编译错误'参数必须输入安全.无效的方差.类型参数'必须在Expression<TDelegate>上

您声明T为协变(使用out关键字),但您不能接受协变参数:

(MSDN)

通常,协变类型参数可以用作返回类型的,并且逆变类型参数可以用作参数类型。对于接口,协变类型参数可以是用作接口方法的返回类型,并且是逆变的类型参数可以用作接口的参数类型方法。

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);
}

我很怀疑这是你在找什么,我不确定它是否会编译/工作,但它可能会有所帮助。