请说明.NET 4.0中的Func委托。

7
在.NET 4.0中,有一个内置的委托方法:
public delegate TResult Func<in T, out TResult>(T arg);

它被用于LINQ扩展方法中,例如:

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个回答

12
Func<T,TResult> 的意思是:接受一个 T 参数并返回一个 TResult 的方法。你的 lambda 符合这个定义,因为对于 T=XElementTResult=bool,你的 lambda 接受一个 T 并返回一个 TResult。在这种特定情况下,它通常被称为谓词。编译器可以根据使用情况推断泛型类型参数(TTResult),但不是所有情况都适用。
请注意,inout 是指方法的协变和逆变行为,而不是 普通 用法中的 out(即此处的 out 不表示按引用传递,不假定在调用时分配,并且需要在退出之前分配)。

如果你在这个上下文中把“method”改成“function”,我会同意你的答案并点赞它。 - Lajos Arpad
3
不,这样做是错误的;特别是 C# 没有 函数;像 Func<T,TResult> 这样的委托绑定到一个 方法 - Marc Gravell
你可以创建模块,其中可以添加不属于任何类的函数,因此,C#也有函数,而不仅仅是方法。我几乎确定(但没有测试)模块中的函数可以是谓词。尽管我在这条评论的第二部分可能是错误的。 - Lajos Arpad
+1 你说得对,这只存在于Visual Basic中。我确信C#有类似的东西,但我错了。 - Lajos Arpad

5

Func<T,TResult>需要两个泛型参数:TTResult。正如你所看到的,Targ参数的类型,而TResult则是返回类型,因此您的代码

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

将会是一个有效的 Func<XElement, bool>

inout 泛型修饰符表示参数是逆变或协变的。


1
而这个神奇的技巧,是.NET使用类型推断来确定TTResult的类型。因此它会自动从p的类型中推断出T,并从结果值(布尔型)StartsWith("Q")中推断出TResult - Claus Jørgensen
没错!正如Marc所指出的,返回boolean的委托通常被称为谓词。 - Connell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接