Al pasar dinámico al método, el resultado es una expresión dinámica, incluso si no es

En C # 5 cuando intenté pasar una dinámica como parámetro de método, el resultado por alguna razón se volvió dinámico.

class Program
{
    static void Main(string[] args)
    {
        dynamic value = "John";
        Find<int>(value).ToList();
    }

    public static IEnumerable<T> Find<T>(object value)
    {
        //SOME LOGIC
        yield return default(T); //REAL RESULT
    }
}

Find<T>(value) tiene que volverIEnumerable<T>. ¿Por qué el compilador piensa que es dinámico?
Yo sé esoFind<int>(val as object).ToList(); resuelve esto, pero quiero entenderPOR QUÉ Sucede.

Respuestas a la pregunta(2)

Su respuesta a la pregunta