请解释.NET 4.0中的Func委托

Leo*_* Vo 7 .net c# lambda delegates

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

public delegate TResult Func<in T, out TResult>(T arg);
Run Code Online (Sandbox Code Playgroud)

它用于LINQ extesion方法,例如:

IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
Run Code Online (Sandbox Code Playgroud)

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

// p is a XElement object
p=>p.Element("firstname").Value.StartsWith("Q")
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 12

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

注意inout参考方法的(co | contra) - 方差行为 - 不是正常使用out(即out这里不代表 by-ref,不假设在呼叫时分配,需要在退出前分配) .

  • @Lajos不,这样做是不正确的**; 特别是C#*没有*函数; 一个委托,如`Func <T,TResult>`绑定**方法**. (3认同)

Con*_*ell 5

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

// p is a XElement object
p=>p.Element("firstname").Value.StartsWith("Q")
Run Code Online (Sandbox Code Playgroud)

将是有效的Func<XElement, bool>.

通用修饰符意味着该参数是逆变或协变.