Концепция лямбда-выражения существует только в виде исходного кода.Он даже не имеет типа сам по себе (так же, как у литерала 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);