Невозможно преобразовать асинхронное лямбда-выражение в тип делегата 'Func <UIAccessibilityCustomAction, bool> - PullRequest
0 голосов
/ 06 ноября 2018

Получение ошибки:

Ошибка CS4010: невозможно преобразовать асинхронное лямбда-выражение в тип делегата «Func». Асинхронное лямбда-выражение может возвращать void, Task или Task, ни одно из которых не может быть преобразовано в 'Func

UIAccessibilityCustomAction someAccessibilityAction = new
                UIAccessibilityCustomAction(
                SwipeActionMarkTextValue("Accessibility Text", false),
                            async (UIAccessibilityCustomAction arg) =>{

                                 await TestAsyncMethod();
                                return true;
                            });


    private async Task<bool> TestAsyncMethod()
    {
         await Task.Delay(5000);
        return true;
    }

1 Ответ

0 голосов
/ 06 ноября 2018

Ваш асинхронный метод не возвращает bool. Возвращает задание .

Помните, что async является (своего рода) синтаксическим сахаром для ContinueWith. Ваш синтаксис идеален, но он помогает проиллюстрировать мою точку зрения, если я переписываю его так:

(UIAccessibilityCustomAction arg) => TestAsyncMethod().ContinueWith(b => true)

Возможные решения

Я не знаком с Xamarin.iOS, и это также зависит от задачи, которую вы хотите достичь, но вот несколько общих решений:

  1. Используйте API, который принимает асинхронный обратный вызов, если он есть.
  2. Сделайте свою работу синхронной.
  3. Ожидание (блокировка) вашего рабочего элемента:

    /*NO ASYNC HERE*/ (UIAccessibilityCustomAction arg) =>{
        TestAsyncMethod().GetAwaiter().GetResult();
            return true;
        })
    

    В зависимости от вашей ситуации это может привести к тупику .

  4. Сделайте так, чтобы ваш работник "выстрелил и забыл" (async void) и сразу же вернул true после того, как его сбросили.

    UIAccessibilityCustomAction someAccessibilityAction = new UIAccessibilityCustomAction(
        SwipeActionMarkTextValue("Accessibility Text", false),
        (UIAccessibilityCustomAction arg) => {
            TestAsyncMethod();
            return true;
        });
    private async void TestAsyncMethod()
    {
        await Task.Delay(5000);
    }
    
...