Ответ 1
Функция, которая принимает делегат в качестве параметра, должна использовать именованный тип делегирования; в отличие от Objective-C, вы не можете объявить анонимный тип делегата inline в определении функции. Однако генерические действия Action < > и Func < > предоставляются так, что вам не нужно объявлять новый тип самостоятельно. В приведенном ниже коде я предполагаю, что делегат принимает один int
в качестве параметра.
void DoSomethingWithCallback(Func<int,Task> callbackDelegate)
{
Task t = callbackDelegate(42);
}
Если эта функция фактически ничего не делает с возвращенным объектом задачи (как и с приведенным выше кодом), вы можете вместо этого использовать Action<int>
в качестве типа делегата. Если вы используете Action, вы все равно можете объявить асинхронный делегат (ниже), но возвращенный неявный объект Task игнорируется.
Синтаксис лямбда для вызова указанной функции прост и синтаксис, который вы использовали в вопросе, верен. Обратите внимание, что здесь не нужно указывать тип параметра, поскольку он может быть выведен следующим образом:
DoSomethingWithCallback(async (intParam) => { this.myint = await Int2IntAsync(intParam); });
Вы также можете передать метод или делегировать переменную, если хотите, вместо использования синтаксиса лямбда:
async Task MyInt2Int(int p) { ... }
Func<int,Task> myDelegate;
void OtherMethod()
{
myDelegate = MyInt2Int;
DoSomethingWithCallback(myDelegate); // this ...
DoSomethingWithCallback(MyInt2Int); // ... or this.
}