C# 中 Predicate 和 Func 委托的区别

amj*_*jad 0 .net c# delegates

我是 C# 的初学者,只是一个关于 C# 中 Predicate 和 Func 委托之间差异的问题

我们知道:

public delegate bool Predicate<in T>(T obj);

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

所以如果我喜欢

Func<Product, bool> firstdelegate = ...
Run Code Online (Sandbox Code Playgroud)

Predicate<Product> secondpredicate = ...
Run Code Online (Sandbox Code Playgroud)

他们不一样吗?我的意思是他们都做同样的事情,那么为什么在 LINQ 的 Where() 方法中采用 Func 类型委托而不是 Predicate 呢?

Dam*_*ver 6

Predicate<T>.NET 2.0 中引入了泛型。这是一个接受一个参数并返回一个bool.

然而,随着 .NET 3.5 中 LINQ 的引入,确定了对两个泛型类型系列的需求 -Func并且Action(区别在于它们是否返回任何内容)占用多达16 4 1 个泛型输入参数并且在它们的返回类型中是泛型的. 如果Func首先存在,Predicate<T>就永远不会被创造。这是一种不必要的专用委托类型。

但是,出于向后兼容性的原因,它们现在无法从框架中删除 Predicate<T>有些人可能会争辩说,它的名称确实传达了特定的语义含义,但我很难确定任何Func<T,bool>(或Func<T1,T2,bool>等)不会被视为谓词的许多情况。


1 4 在 .NET 3.5 中,16 在 .NET 4 和更高版本中。