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("");
这有点出乎意料,但这就是编译器的工作原理。 当我想到它时,它现在才有意义。
上述就是C#学习教程:C#Func和条件运算符分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1017948.html