2014-09-04 113 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;