2014-11-25 58 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); 

它会很高兴地推断出你的类型。