C# 编译器错误"参数必须输入安全。差异无效。类型参数 'T' 必须始终对表达式<TDelegate> ' 有效



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

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

您声明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);
}

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

相关内容

  • 没有找到相关文章

最新更新