当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何使用条件三元运算符在lambdas之间有条件地分配Func<>?》经验,为你挑选了2个好方法。

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

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

没有什么花哨的,非常直接的.

现在,让我们在将Lambda分配给Func类型时尝试使用它.让我解释:

Func predicate = id == null
    ? p => p.EmployeeID == null
    : p => p.EmployeeID == id;

这是相同的语法,应该工作吗?对?出于某种原因,没有.编译器提供了这个不错的神秘消息:

错误1无法确定条件表达式的类型,因为"lambda表达式"和"lambda表达式"之间没有隐式转换

然后我继续改变语法,这样它确实有效:

Func predicate = id == null
    ? predicate = p => p.EmployeeID == null
    : predicate = p => p.EmployeeID == id;

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

(旁注:我最终不需要这段代码,因为我发现在将int值与null进行比较时,只需使用object.Equals)



1> Jon Skeet..:

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

我建议不要使用作业 - 演员阵容更明显:

Func predicate = id == null 
    ? (Func) (p => p.EmployeeID == null)
    : p => p.EmployeeID == id;

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



2> Jake..:

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

Func predicate = 
    id == null ? 
        new Func(p => p.EmployeeID == null) :
        new Func(p => p.EmployeeID == id);

但这很糟糕,你也可以试试

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


后者不起作用,因为编译器不知道是否要转换为委托或表达式树(或者说,例如,Func 也可以).
推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有