如何使用条件三元运算符在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;