【发布时间】:2020-01-20 15:20:11
【问题描述】:
我发现自己不得不对列表中的元素做一些事情,然后将它们从该列表中删除:
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 和 .RemoveAll 的参数,但我无法使用x for .RemoveAll 因为它的重载只接受Predicate<T>。
为什么不能进行隐式或显式强制转换,因为两者具有相同的返回和参数类型?
(我不是在寻找进行转换的方法,关于它的一切都已经in this quesion)
【问题讨论】:
-
为什么不使用链接线程的解决方案?
-
...因为该语言不允许不同委托类型之间的隐式或显式转换(即使它们具有兼容的签名)
-
@PavelAnikhouski 正如问题中提到的那样,我不是在寻找执行转换的方法,我只是在问为什么无法进行演员表
-
因为不需要?请记住,
Func是一个相对较新的添加:据我所知,最初的意图是委托的每个 use 都会获得自己的委托类型:委托的名称和它的参数名称与参数的类型 一样重要。在那之下,你为什么能够隐式地将Predicate<T>(用于确定对象是否符合标准)转换为Converter<T, bool>(用于数据类型之间的映射):它们是完全不同的东西!然后 linq 出现了...... -
如果你有两个类,比如
class A { int a; }和class B { int a; },你也不会想到这些类型之间的可分配性。