小编典典

如何使用条件三元运算符在lambda之间有条件地分配Func <>?

c#

通常,使用条件运算符时,语法如下:

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。)


阅读 373

收藏
2020-05-19

共1个答案

小编典典

您可以将lambda表达式转换为特定的目标委托类型,但是为了确定条件表达式的类型,编译器需要知道第二个操作数和第三个操作数的类型。虽然它们都只是“
lambda表达式”,但它们之间没有转换,因此编译器无法做任何有用的事情。

我不建议使用分配,但是-强制转换更为明显:

Func<Order, bool> predicate = id == null 
    ? (Func<Order, bool>) (p => p.EmployeeID == null)
    : p => p.EmployeeID == id;

请注意,您只需要为一个操作数提供它,这样编译器就可以从另一个lambda表达式执行转换。

2020-05-19