好的,我迷路了。为什么第一个函数为WRONG(在lambda表达式中为squiglies),但第二个函数为RIGHT(意味着它编译)?
public static Expression<Func<IProduct, string, bool>> IsValidExpression(string val)
{
return (h => h.product_name == val);
}
public static Expression<Func<IProduct, bool>> IsValidExpression2()
{
return (m => m.product_name == "ACE");
}
答案 0 :(得分:6)
你的第一个函数需要两个参数。 Func<x,y,z>
定义了两个参数和返回值。由于您有IProduct
和string
作为参数,因此您的lambda中需要两个参数。
public static Expression<Func<IProduct, string, bool>> IsValidExpression(string val)
{
return ((h, i) => h.product_name == val);
}
你的第二个函数只有Func<x,y>
,这意味着函数签名只有一个参数,因此你的lambda语句会编译。
答案 1 :(得分:3)
中间string
打算做什么?您可以通过以下方式进行编译:
public static Expression<Func<IProduct, string, bool>> IsValidExpression(string val)
{
return (h,something) => h.product_name == val;
}
或者你的意思是:
public static Expression<Func<IProduct, string, bool>> IsValidExpression()
{
return (h,val) => h.product_name == val;
}
答案 2 :(得分:0)
Func<IProduct, string, bool>
是具有以下签名的方法的委托:
bool methodName(IProduct product, string arg2)
{
//method body
return true || false;
}
所以
public static Expression<Func<IProduct, string, bool>> IsValidExpression(string val)
{
return (h => h.product_name == val);
}
在返回类型和返回值之间存在差异。您正在尝试返回Expression<Func<IProduct, bool>>
类型的对象。
val参数不是你所委托的方法的参数,而是将被提升(作为实现结果函数的类的一部分),并且因为它不是结果方法的参数,所以它不应该是Func
类型声明
答案 3 :(得分:-1)
在尝试修复lambda表达式之前,请确保将以下引用添加到相关的cs文件中:
using System.Linq;
using System.Linq.Expressions;
缺少这些引用也可能导致相同的错误(“无法将lambda表达式转换为类型'System.Linq.Expressions.Lambda Expression',因为它不是委托类型”)。