FindAll - Predicate <tsource> vs Func <tsource,bool =“”>

时间:2018-03-11 21:36:05

标签: c# .net

我很难理解为什么List<T>FindAll(...)方法不接受Func<TSource, bool>,而是坚持接受Predicate<TSource>

所以当我有一本List本书时,我只想买一本比10便宜的书。这段代码运行得很好。

  Predicate<Book> CheapBooksPredicate = b => b.Price < 10;
  var cheapBooksPredicate = books.FindAll(CheapBooksPredicate);

但是当我将Predicate<TSource>更改为Func<TSource, bool>

   Func<Book, bool> CheapBooksFunc = b => b.Price < 10;
   var cheapBooksFunc = books.FindAll(CheapBooksFunc);

我收到错误:

  

参数1:无法转换为System.Func&#39;到&#39; System.Predicate&#39;

我在这里错过了什么?当Func<TSource, bool>Predicate<TSource>都是predicates时。 Predicate<TSource>应该是Func的专用版本,它根据一组条件获取和计算一个值并返回一个布尔值,因此我可以在使用方面相互替换。

2 个答案:

答案 0 :(得分:5)

它们具有相同的签名,但它们基本上是不同的类型,不能作为参考保留转换。由于FindAll需要Predicate<T>:使用Predicate<T>

如果他们像这样可以施放会不会很好?也许,但它需要CLR和语言更改,并且不太可能发生。

答案 1 :(得分:1)

您可以使用以下扩展方法将Func<T, bool>转换为Predicate<T>

static Predicate<T> FuncToPredicate<T>(Func<T, bool> func)
{
   return new Predicate<T>(func);
}

Reference