The_Unknown_Member Ответов: 2

C# что передает Аргументы анонимным функциям?


Я читаю книгу и у меня есть проблемы с пониманием этого кода:
List<int> evenNumbers = list.FindAll(delegate(int i) 
{ 
   return (i % 2) == 0;
}; 


Я не могу понять, что произойдет с этим кодом. Кто и как передает аргумент параметру i? Я действительно запутался.

Что я уже пробовал:

Я думаю об этом, но не могу понять, что именно происходит.

Richard Deeming

Если вы сомневаетесь, вы почти всегда можете просмотреть источник встроенных методов, чтобы увидеть, как они реализованы:
Список<T>.Метод findAll[^]

2 Ответов

Рейтинг:
20

Peter Vegter

Для каждого элемента в списке 'list' the .Метод net 'FindAll' вызывает метод делегата, чтобы получить значение (true или false), указывающее, следует ли добавить это значение в список 'evenNumbers'. Итак, тот самый .Метод net 'FindAll' передает значение i методу делегата.

https://msdn.microsoft.com/nl-nl/library/windows/desktop/fh1w7y8z(v=против 85).aspx[^]


The_Unknown_Member

Оооо, я получил это... Я передаю анонимный метод параметру Predecate<t> этого метода. Разве я не прав?

Peter Vegter

Да, вы правы!

The_Unknown_Member

Спасибо!!!

Peter Vegter

Всегда пожалуйста! Спасибо за ответ и голосование.

The_Unknown_Member

Последний вопрос:как FindAll не принимает ничего, кроме логического значения? Я хочу знать эту конкретную деталь реализации. Это универсальный метод, но он работает только с логическими значениями, и когда я пытаюсь вернуть int, например, компилятор выдает ошибку: "не удается преобразовать лямбда-выражение в предполагаемый тип делегата, потому что некоторые типы возвращаемых данных в блоке не являются неявно конвертируемыми в тип возвращаемого делегата".

Делегат также является общим.

Peter Vegter

Спецификация 'FindAll' гласит: 'извлекает все элементы, соответствующие условиям, определенным указанным предикатом'.
Предикат-это метод делегата, который возвращает значение bool. Делегат является общим для передаваемого аргумента (int, float, double и т. д.), Но возвращаемое значение метода предиката всегда является "bool" - это как сокращение от " bool MatchMethod<T>". Таким образом, если вы укажете другое возвращаемое значение, вы получите ошибку компилятора точно так же, как когда вы делаете что-то подобное с "нормальным" методом:

тест на пустоту()
{
bool result = GetResult(); // ошибка! - GetResult() не возвращает bool.
}

инт метод getresult()
{
возврат 10;
}