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