我很难理解为什么List<T>FindAll(...)方法不接受Func<TSource, bool>,而是坚持接受Predicate<TSource>.
因此,当我有一List本书时,我只想获得比10便宜的书.这个代码运行得很好.
Predicate<Book> CheapBooksPredicate = b => b.Price < 10;
var cheapBooksPredicate = books.FindAll(CheapBooksPredicate);
Run Code Online (Sandbox Code Playgroud)
但是当我换Predicate<TSource>到Func<TSource, bool>
Func<Book, bool> CheapBooksFunc = b => b.Price < 10;
var cheapBooksFunc = books.FindAll(CheapBooksFunc);
Run Code Online (Sandbox Code Playgroud)
我收到错误:
参数1:无法从'System.Func'转换为'System.Predicate'
我在这里失踪了什么?当两个Func<TSource, bool>和Predicate<TSource>的predicates.Predicate<TSource>应该是a的专用版本,Func它根据一组条件获取和计算一个值并返回一个布尔值,因此我可以在使用方面相互替换它们.
它们具有相同的签名,但它们基本上是不同的类型,不能作为参考保留转换.既然FindAll想要Predicate<T>:使用Predicate<T>.
如果他们像这样可以施放会不会很好?也许,但它需要CLR和语言更改,并且不太可能发生.
| 归档时间: |
|
| 查看次数: |
139 次 |
| 最近记录: |