c#编译错误'参数必须输入安全。方差无效。类型参数“T”必须在Expression <tdelegate>'</tdelegate>上不变地有效

时间:2014-06-17 23:19:13

标签: c# covariance contravariance

我想共同使用我的界面(界面必须是共变体),但编译器给我错误 c#编译错误: - &#39;参数必须安全输入。方差无效。类型参数&#39; T&#39;必须在&#39; Expression&#39; 上无条件有效这是我的代码:

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

1 个答案:

答案 0 :(得分:7)

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

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

相关问题