无法从表达式的用法返回表达式推断出方法的类型参数

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (87)

我正在尝试从Select返回一个表达式,所以我有一个表达式返回一个表达式(我想 - 也许这是一个lambda返回一个表达式,我不确定术语)

如果我创建一个显式赋予表达式类型的变量,那么它可以工作,例如

housingDivisions.Select(id => {
    Expression<Func<Document, bool>> expression = d => d.HousingDivisions.Any(h => h.HousingDivisionId == id);
    return expression;
})

但是这段代码似乎相当(并且不那么罗嗦)

housingDivisions.Select(id => d => d.HousingDivisions.Any(h => h.HousingDivisionId == id))

但会导致编译错误:

错误CS0411无法从用法中推断出方法'Enumerable.Select(IEnumerable,Func)'的类型参数。尝试显式指定类型参数。

有没有办法让这个编译而不必创建一个不必要的变量?

提问于
用户回答回答于

问题是类型d和委托类型d => ...都是未知的,不能从任何地方假设。您可以通过实例化委托类型一次解决:

housingDivisions.Select(id => new Func<Document, bool>(d => d.HousingDivisions.Any(h => h.HousingDivisionId == id)))

如果你绝对需要将类型作为表达式树,那么你可以通过转换转换为它:

housingDivisions.Select(id => (Expression<Func<Document, bool>>)(d => d.HousingDivisions.Any(h => h.HousingDivisionId == id)))

编译器建议明确指定参数。就个人而言,我认为这种方式更加冗长。但它看起来像这样:

housingDivisions.Select<int, Expression<Func<Document, bool>>>(id => d => d.HousingDivisions.Any(h => h.HousingDivisionId == id));

这是选择表达式的扩展方法:

public static IEnumerable<Expression<Func<ExprArg, Result>>> SelectExpr<TSource, ExprArg, Result>(this IEnumerable<TSource> source, Func<TSource, ExprArg, Result> func)
{
    return source.Select((o) => (Expression<Func<ExprArg, Result>>)((arg) => func(o, arg)));
}


// Use:
housingDivisions.SelectExpr((int id, Document d) => d.HousingDivisions.Any(h => h.HousingDivisionId == id));

扫码关注云+社区

领取腾讯云代金券