2014-09-04 106 views
3

我知道Func<> s不能被隐式地直接通过var关键字打字,虽然我很希望,我可以做谓语的分配如下:如何使用条件三元运算符分配Func <>?

Func<Something, bool> filter = (someBooleanExpressionHere) 
    ? x => x.SomeProp < 5 
    : x => x.SomeProp >= 5; 

但是,我得到的错误cannot resolve the symbol, 'SomeProp'

目前,我已经采取了更繁琐的if branch任务,这似乎并不优雅。

Func<Something, bool> filter; 
if (someBooleanExpressionHere) 
{ 
    filter = x => x.SomeProp < 5; 
} 
else 
{ 
    filter = x => x.SomeProp >= 5; 
} 

我错过了什么,或者我是否需要坚持if-branch任务?

+0

您是否尝试过在各处添加括号?例如'(x => x.SomeProp <5)' – 2014-09-04 14:14:48

+1

编译器可能不知道lambda变量x是什么类型。为什么不把这两个表达式放在单独的变量中,然后使用三元运算符将其中的一个赋值给过滤变量? – 2014-09-04 14:15:16

+0

@AlexMDC:有。不起作用。 – 2014-09-04 14:29:25

回答

7
var filter = (someBooleanExpressionHere) 
    ? new Func<Something, bool>(x => x.SomeProp < 5) 
    : x => x.SomeProp >= 5; 
+0

谢谢 - 我开始使用var - 种奖金:)! – StuartLC 2014-09-04 14:18:40

+1

@StuartLC你可以使用'var',但不是没有*也*明确地输入类型名称,所以你实际上没有'var'的好处。其实,我会说有合理数量的人会认为你的原始'if' /'else'比这更优雅。 (就我个人而言,我是分歧的,我没有真正的偏好。) – hvd 2014-09-04 14:20:05

+1

是的,因此是'善良的'。但至少我不必拼写出我的lambda签名*两次*! – StuartLC 2014-09-04 14:21:24

3

你应该将它们包装在一个new Func,因为否则它可以在一个lamdba不能转换为另:

Func<Something, bool> filter = (someBooleanExpressionHere) 
    ? new Func<Something, bool>(x => x.SomeProp < 5) 
    : x => x.SomeProp >= 5 
    ; 

如果删除new Func...您将获得:

类型条件表达式不能被确定,因为'lambda表达式'和'lambda表达式'之间没有隐式转换

+0

第二个操作数的括号不是绝对必要的,但我同意他们值得添加。不是每个人都记得所有的优先规则,所以它提高了可读性。 – 2014-09-04 14:17:34

+0

的确,我第一次尝试了两个'新的Func',但最后一个没有必要。 – 2014-09-04 14:18:22

1

可以明确的提及类型的提示编译

var filter = (condition) 
    ? (Func<Something, bool>)(x => x.SomeProp < 5) 
    : x => x.SomeProp >= 5; 
0

如果合适的话,你可以分配这些选择以静态字段。

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;