2014-11-25 90 views
2

爲了更好的可讀性,我想在C#中定義的內聯函數,像這樣的:內聯函數定義

var HasFullAccess = (mask => mask % 2 == 1); 
foreach(AccessControlEntry ace in acl) 
{ 
    if(HasFullAccess(ace.AccessMask)) ... 

的問題是var。我想我必須把東西。那告訴C#期望lambda表達式?我也試過

(int => bool) HasFullAccess = (mask => mask % 2 == 1); 

這也不起作用。那麼我怎樣才能定義一個內聯函數呢?

+3

'Func HasFullAccess = ...' – leppie 2014-11-25 10:56:51

+2

我寧願使用'(mask&1)!= 0'這是檢查標誌的慣用方法。 – CodesInChaos 2014-11-25 10:57:37

回答

3

你可以這樣做

Func<int,bool> HasFullAccess = mask => mask % 2 == 1; 
2

這樣

var hasFullAccess = new Func<int, bool>(mask => mask % 2 == 1); 

或此,

Func<int, bool> hasFullAccess = mask => mask % 2 == 1; 

對於其他類型的功能,您將需要使用兼容的委託類型。你必須給編譯器一些幫助。

2

您不能將一個lambda表達式分配給一個隱式類型局部變量(如編譯器應該指出的那樣)。您必須明確指定您的委託類型(本例中爲Func<int, bool>)。

var HasFullAccess = new Func<int, bool>(mask => mask % 2 == 1); 

,或者

Func<int, bool> HasFullAccess = mask => mask % 2 == 1; 
0

標準的方式來做到這一點是確定這個幫助功能:在

public static Func<A, T> func<A, T>(Func<A, T> f) 
{ 
    return f; 
} 

某處你的名字空間。那麼你可以撥打

var myfunc = func((int mask) => mask % 2 == 1); 

它會很高興地推斷出你的類型。