Подтвердить что ты не робот

Рекурсия с Func

Можно ли выполнить рекурсию с делегатом Func? У меня есть следующее, которое не компилируется, потому что имя Func не в области...

Func<long, long, List<long>, IEnumerable<long>> GeneratePrimesRecursively = (number, upperBound, primeFactors) => 
{
    if (upperBound < number)
    {
        return primeFactors;
    }
    else
    {
        if (!primeFactors.Any(factor => number % factor == 0)) primeFactors.Add(number);
        return GeneratePrimesRecursively(++number, upperBound, primeFactors); // breaks here.
    }
};
4b9b3361

Ответ 1

Вот так:

Func<...> method = null;
method = (...) => {
    return method();
};

Ваш код создает ошибку, потому что вы пытаетесь использовать переменную, прежде чем назначать ее.
Ваше лямбда-выражение скомпилировано до того, как будет установлена ​​переменная (переменная может быть установлена ​​только в полное выражение), поэтому она не может использовать переменную. Установка переменной в null сначала позволяет избежать этой проблемы, поскольку она уже будет установлена ​​при компиляции лямбда-выражения.

В качестве более мощного подхода вы можете использовать YCombinator.