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


Answers

C#编译器无法推断创建的lambda表达式的类型,因为它首先处理三元组然后处理赋值。 你也可以这样做:

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;
Question

通常,在使用条件运算符时,这是语法:

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)




Links