C# 如何分配函数<&燃气轮机;使用条件三元运算符?
我知道,C# 如何分配函数<&燃气轮机;使用条件三元运算符?,c#,lambda,func,C#,Lambda,Func,我知道,Funcs不能通过var关键字直接隐式键入,尽管我非常希望我可以对谓词进行以下赋值: Func<Something, bool> filter = (someBooleanExpressionHere) ? x => x.SomeProp < 5 : x => x.SomeProp >= 5; 我是否遗漏了什么,或者我是否需要继续使用if分支分配?var filter=(这里有一些布尔表达式) var filter = (someBool
Func
s不能通过var
关键字直接隐式键入,尽管我非常希望我可以对谓词进行以下赋值:
Func<Something, bool> filter = (someBooleanExpressionHere)
? x => x.SomeProp < 5
: x => x.SomeProp >= 5;
我是否遗漏了什么,或者我是否需要继续使用if分支分配?var filter=(这里有一些布尔表达式)
var filter = (someBooleanExpressionHere)
? new Func<Something, bool>(x => x.SomeProp < 5)
: x => x.SomeProp >= 5;
? 新函数(x=>x.SomeProp<5)
:x=>x.SomeProp>=5;
您应该将它们包装在新函数中,否则它无法将一个lamdba转换为另一个lamdba:
Func<Something, bool> filter = (someBooleanExpressionHere)
? new Func<Something, bool>(x => x.SomeProp < 5)
: x => x.SomeProp >= 5
;
Func filter=(someBooleanExpressionHere)
? 新函数(x=>x.SomeProp<5)
:x=>x.SomeProp>=5
;
如果删除新功能…
,您将获得:
无法确定条件表达式的类型,因为“lambda expression”和“lambda expression”之间没有隐式转换
您可以显式地提到类型作为编译器的提示
var filter = (condition)
? (Func<Something, bool>)(x => x.SomeProp < 5)
: x => x.SomeProp >= 5;
var过滤器=(条件)
? (Func)(x=>x.SomeProp<5)
:x=>x.SomeProp>=5;
如果合适,您可以将这些选择器分配给静态字段
private static readonly Func<Something, bool> _someFilter = x => x.SomeProp < 5;
private static readonly Func<Something, bool> _someOtherFilter = x => x.SomeProp >= 5;
你试过在不同的地方加括号吗?e、 g.(x=>x.SomeProp<5)
编译器可能不知道lambda变量x是什么类型。为什么不将这两个表达式放在单独的变量中,然后使用三元运算符将其中一个表达式指定给过滤器变量?@AlexMDC:Did。不起作用。第二个操作数上的括号不是严格必需的,尽管我同意它们值得添加。并不是每个人都记得所有的优先规则,所以它提高了可读性。没错,我第一次尝试使用两个新函数,但最后一个不是必需的。谢谢你-我开始使用var-种类-奖金:)@StuartLC您可以使用var
,但也必须明确键入类型名,因此您实际上没有var
的好处。事实上,我认为有相当数量的人会考虑你原来的<代码>如果 /Cuth> Ethy/<代码>比这更优雅。(就我个人而言,我有分歧。我对其中一个没有真正的偏好。)是的,因此有“某种”。但至少我不必两次拼出我的lambda签名!为了进一步解释为什么需要这样做,C#中的lambda本身没有类型,lambda的类型是根据用法推断出来的。在三元条件表达式的情况下,编译器无法推断lambda类型,因为它需要知道这一点才能推断条件表达式的类型。显式实例化Func
允许编译器计算表达式类型,并从中推断出另一个lambda的类型也是Func
。
private static readonly Func<Something, bool> _someFilter = x => x.SomeProp < 5;
private static readonly Func<Something, bool> _someOtherFilter = x => x.SomeProp >= 5;
var filter = (someBooleanExpressionHere) ? _someFilter : _someOtherFilter;