为什么无法将 Func<T, bool> 转换为 Predicate<T>?

Why is it impossible to cast Func<T, bool> to Predicate<T>?

我发现自己处于一种情况,我必须对列表的元素做一些事情,然后将它们从列表中删除:

foreach (var element in someList.Where(e => e.IsMatching))
{
    // do some stuff
}

someList.RemoveAll(e => e.IsMatching);

这很好用,但我不喜欢重复的 lambda,所以我声明了一个 Func<T, bool> x = e => e.IsMatching; 然后尝试使用 x 作为 .Where 和 [=16 的参数=] 但我无法将 x 用于 .RemoveAll 因为它的重载只接受 Predicate<T>.

为什么隐式或显式转换都不可能,因为两者具有相同的 return 和参数类型?

(我不是在寻找进行转换的方法,关于它的一切都已经 in this quesion

IEnumerable<T>.Where扩展方法和List<T>RemoveAll方法采用两种不同的类型有点傻。然而,这是一个简单的解决方法,因为本地函数可用于初始化 Func<int, bool>Predicate<int>:

var l = new List<int> {1, 2, 3, 5, 5, 6, 6};
bool Pred(int i) => i < 5;
var wh = l.Where(Pred);
var rem = l.RemoveAll(Pred);