Почему невозможно разыграть Fun c предсказать <T>? - PullRequest
0 голосов
/ 20 января 2020

Я оказался в ситуации, когда мне пришлось что-то сделать с элементами списка, а затем удалить их из этого списка:

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

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

Это прекрасно работает, но мне не нравится дублирующаяся лямбда поэтому я объявил Func<T, bool> x = e => e.IsMatching;, а затем попытался использовать x в качестве параметра для .Where и .RemoveAll, но я не смог использовать x для .RemoveAll, поскольку его перегрузка принимает только Predicate<T> .

Почему неявное и явное приведение невозможно, так как оба имеют одинаковые возвращаемые значения и типы параметров?

(Я не ищу способ выполнить преобразование, все в нем уже в этом вопросе )

1 Ответ

1 голос
/ 20 января 2020

Немного глупо, что метод расширения 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);
...