C#Func和条件运算符

重复

我可以做这个:

Func orderByFunc; if (orderBy == OrderProductsByProperty.Speed) orderByFunc = x => x.Speed; else orderByFunc = x => x.Price; 

为什么我不能这样做:

 Func orderByFunc = (orderBy == OrderProductsByProperty.Speed) ? x => x.Speed : x => x.Price; 

条件运算符上的“类型推断”不够好,我得到的消息就像

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

你可以随时在右手边明确表达

 var o = true ? new Func(x => 0) : new Func(x => 1); 

无论如何,关于lambdas类型,类型推断和条件运算符如何相互作用,这只是一个小麻烦。

只需将lambda转换为Func

到目前为止建议的替代方法 – 在lambda表达式中移动条件:

 Func orderByFunc = x => (orderBy == OrderProductsByProperty.Speed) ? x.Speed : x.Price; 

它可能不适用于所有情况(并且它确实意味着在每次调用时都执行检查)但有时它可能是有用的。

编辑:正如埃里克指出的那样,两者并不相同。 下面是一个快速示例,说明它们的区别(使用显式转换使条件在操作数为lambdas的地方工作):

 using System; class Test { static void Main() { bool likesCheese = false; Action outerConditional = likesCheese ? (Action) (() => Console.WriteLine("Outer: I like cheese")) : (Action) (() => Console.WriteLine("Outer: I hate cheese")); Action innerConditional = () => Console.WriteLine (likesCheese ? "Inner: I like cheese" : "Inner: I hate cheese"); Console.WriteLine("Before change..."); outerConditional(); innerConditional(); likesCheese = true; Console.WriteLine("After change..."); outerConditional(); innerConditional(); } } 

结果:

 Before change... Outer: I hate cheese Inner: I hate cheese After change... Outer: I hate cheese Inner: I like cheese 

如您所见,对likesCheese值的likesCheese仅影响在lambda表达式中具有条件运算符的版本。 有时这是可取的,有时候不是……但你肯定需要注意它。

仅将一个结果操作数转换为目标类型就足够了:

 Action showResult = true ? (Action)(() => Console.Write("Hello!")) : () => Console.Write(""); 

这有点出乎意料,但这就是编译器的工作原理。 当我想到它时,它现在才有意义。