我很难理解为什么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
的专用版本,它根据一组条件获取和计算一个值并返回一个布尔值,因此我可以在使用方面相互替换。
答案 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);
}