Resolução de sobrecarga peculiar com while (true)

Eu estava implementando sobrecargas de sincronização / async quando me deparei com essa situação peculiar:

Quando eu tenho uma expressão lambda regular sem parâmetros ou um valor de retorno, ela vai para oRun sobrecarga com oAction parâmetro, que é previsível. Mas quando esse lambda tem umwhile (true) nele vai para a sobrecarga com oFunc parâmetro.

public void Test()
{
    Run(() => { var name = "bar"; });
    Run(() => { while (true) ; });
}

void Run(Action action)
{
    Console.WriteLine("action");
}

void Run(Func<Task> func) // Same behavior with Func<T> of any type. 
{
    Console.WriteLine("func");
}

Resultado:

açao
func

Então, como pode ser isso? Existe uma razão para isso?

questionAnswers(1)

yourAnswerToTheQuestion