C# 为什么无法施展Func<;T、 布尔>;断言<;T>;?

C# 为什么无法施展Func<;T、 布尔>;断言<;T>;?,c#,delegates,C#,Delegates,我发现自己的处境是,我必须对列表中的元素进行一些处理,然后将它们从列表中删除: foreach (var element in someList.Where(e => e.IsMatching)) { // do some stuff } someList.RemoveAll(e => e.IsMatching); 这很好用,但我不喜欢重复的lambda,所以我声明了aFunc x=e=>e.IsMatching然后尝试使用x作为.Where和.RemoveAll的参数,

我发现自己的处境是,我必须对列表中的元素进行一些处理,然后将它们从列表中删除:

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

someList.RemoveAll(e => e.IsMatching);
这很好用,但我不喜欢重复的lambda,所以我声明了a
Func x=e=>e.IsMatching
然后尝试使用
x
作为
.Where
.RemoveAll
的参数,但我无法使用
x
作为
.RemoveAll
的参数,因为其重载只接受
谓词

既然隐式转换和显式转换都具有相同的返回类型和参数类型,为什么不能进行隐式转换和显式转换呢


(我不是在寻找进行转换的方法,它的一切都已经实现了)

如果
IEnumerable有点傻。Where
扩展方法和
列表
RemoveAll
方法采用两种不同的类型。但是,这是一个简单的解决方法,因为本地函数可用于初始化
函数
谓词

var l=新列表{1,2,3,5,5,6,6};
bool-Pred(inti)=>i<5;
var wh=l.Where(Pred);
var rem=l.RemoveAll(Pred);

为什么不使用链接线程的解决方案?。。。因为该语言不允许在不同的委托类型之间进行隐式或显式转换(即使它们具有兼容的签名)@PavelAnikhouski,正如问题中所提到的,我不是在寻找执行转换的方法,我只是问为什么不可能进行转换,因为没有必要?记住
Func
是一个相对较新的添加:据我所知,最初的意图是每次使用委托都会得到自己的委托类型:委托的名称及其参数的名称与参数的类型一样重要。在这种情况下,为什么您能够隐式地将
谓词
(用于确定对象是否满足条件)转换为
转换器(用于数据类型之间的映射):它们是完全不同的东西!然后linq出现了……如果你有两个类,比如
classa{inta;}
classb{inta;}
,你也不会想到这些类型之间的可分配性。
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);