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

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

int x = 6; int y = x == 6 ? 5 : 9; 

没有什么特别的,挺直的。

现在,让我们尝试在将Lambda分配给Functypes时使用它。 让我解释:

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

这是相同的语法, 应该工作? 对? 由于某些原因,不。 编译器给出了这个不错的信息:

错误1无法确定条件expression式的types,因为“lambdaexpression式”和“lambdaexpression式”之间没有隐式转换

然后,我继续前进,改变语法,并以这种方式工作:

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

我只是好奇,为什么它不工作的第一种方式?

(注:我结束了不需要这个代码,因为我发现,比较int值与null,你只是使用object.Equals)

您可以将lambdaexpression式转换为特定的目标委托types,但为了确定条件expression式的types,编译器需要知道每个第二个和第三个操作数的types。 虽然它们都只是“lambdaexpression式”,但是从一个到另一个都没有转换,所以编译器不能做任何有用的事情。

我不会build议使用任务,但是 – 演员更明显:

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

请注意,您只需要为一个操作数提供它,以便编译器可以从另一个lambdaexpression式执行转换。

C#编译器不能推断创build的lambdaexpression式的types,因为它先处理三元组,然后再处理分配。 你也可以这样做:

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

但这只是糟透了,你也可以试试

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