请解释.NET 4.0中的Func委托

时间:2011-11-01 08:04:21

标签: c# .net delegates lambda

在.NET 4.0中,有一个内置的委托方法:

public delegate TResult Func<in T, out TResult>(T arg);

它用于LINQ extesion方法,例如:

IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);

我不清楚Func委托,为什么以下lambda表达式匹配它:

// p is a XElement object
p=>p.Element("firstname").Value.StartsWith("Q")

2 个答案:

答案 0 :(得分:12)

Func<T,TResult>仅表示:接受T作为参数的方法,并返回TResult。你的lambda与之匹配,对于T=XElementTResult=bool,你的lambda取T并返回TResult。在那个特定的情况下,它通常被称为谓词。编译器可以根据许多(并非所有)场景中的用法推断泛型类型参数(TTResult)。

注意inout是指方法的(共|) - 方差行为 - 而不是out正常用法(即out此处表示by-ref,不假设在通话时分配,需要在退出前分配。)

答案 1 :(得分:5)

Func<T,TResult>有两个通用参数:TTResult。如您所见,Targ参数的类型,TResult是返回类型,因此您的代码

// p is a XElement object
p=>p.Element("firstname").Value.StartsWith("Q")

将是有效的Func<XElement, bool>

inout通用修饰符表示参数是逆变或协变的。