通常,使用条件运算符时,语法如下:
int x = 6; int y = x == 6 ? 5 : 9;
没什么花哨的,很简单。
现在,让我们在将Lambda分配给Func类型时尝试使用它。让我解释:
Func<Order, bool> predicate = id == null ? p => p.EmployeeID == null : p => p.EmployeeID == id;
那是相同的语法, 应该 工作吗?对?由于某种原因,那不是。编译器给出了以下信息:
错误1无法确定条件表达式的类型,因为“ lambda表达式”和“ lambda表达式”之间没有隐式转换
然后我继续改变的语法和这种方式 做 的工作:
Func<Order, bool> predicate = id == null ? predicate = p => p.EmployeeID == null : predicate = p => p.EmployeeID == id;
我只是好奇为什么它不能一开始就起作用?
(旁注:我最终不需要此代码,因为我发现在将int值与null进行比较时,您仅使用object.Equals。)
您可以将lambda表达式转换为特定的目标委托类型,但是为了确定条件表达式的类型,编译器需要知道第二个操作数和第三个操作数的类型。虽然它们都只是“ lambda表达式”,但它们之间没有转换,因此编译器无法做任何有用的事情。
我不建议使用分配,但是-强制转换更为明显:
Func<Order, bool> predicate = id == null ? (Func<Order, bool>) (p => p.EmployeeID == null) : p => p.EmployeeID == id;
请注意,您只需要为一个操作数提供它,这样编译器就可以从另一个lambda表达式执行转换。