Вызвать лямбду, не создавая делегата;вызывает CS0149 Имя метода ожидается - PullRequest
0 голосов
/ 31 мая 2018

Я хотел бы создать лямбда-выражение и немедленно вызвать его, и я бы хотел избежать создания делегата;тривиальный пример 1 :

int i = (() => 42)();

Это приводит к ошибке:

CS0149 Ожидаемое имя метода

Есть дваобходные пути:

  • Объявите (локальный) метод:

    int Return42() => 42;
    
    int i = Return42();
    
  • Создайте делегата:

    int i = ((Func<int>)(() => 42))();
    

Можно создать и немедленно вызвать лямбда-выражение, не создавая делегата и не называя его?И если возможно, как можно создать такую ​​лямбду?


1. На самом деле это async Task, который я хотел бы использовать вместоиз Task.ContinueWith (я пытался следовать тому, что Стивен Клири сказал: вы должны стремиться заменить ContinueWith на await);Например:

Task<int> future = (async () =>
                       (await RetrieveLookupFromFarAway())["42"].First())();

С RetrieveLookupFromFarAway что-то вроде:

async Task<ILookup<string, int>> RetrieveLookupFromFarAway()
{
    await Task.Delay(1000);
    return Enumerable.Empty<int>().ToLookup((x) => x.ToString());
}

1 Ответ

0 голосов
/ 31 мая 2018

Концепция лямбда-выражения существует только в виде исходного кода.Он даже не имеет типа сам по себе (так же, как у литерала null нет типа). имеет для преобразования либо в дерево выражений, либо в делегат: это то, что существует в отношении IL и CLR.Компилятор должен выдать код, чтобы создать что-то , и вам нужно указать ему, какой тип вы хотите, чтобы это было.

Компилятор не воспроизводит избранное с точки зрения типов делегатов: whileон может «знать» о Func<T> и использовать его как тип делегата по умолчанию для лямбда-выражения без параметров, это не так.

Ближайшее, что вы получите к тому, чтовы хотите иметь удобный метод, который вы можете вызвать, принимая Func<T>, который может либо просто вернуть функцию, либо выполнить ее и вернуть результат.Например:

public static Func<T> CreateFunc<T>(Func<T> func) => func;
public static T ExecuteFunc<T>(Func<T> func) => func();

Тогда вы можете назвать его как:

CreateFunc(() => 42)();

или

ExecuteFunc(() => 42);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...