Delegar como primer parámetro a un Método de extensión

Damas y caballeros

Recientemente probé este experimento:

static class TryParseExtensions
{
    public delegate bool TryParseMethod<T>(string s, out T maybeValue);
    public static T? OrNull<T>(this TryParseMethod<T> tryParser, string s) where T:struct 
    {
        T result;
        return tryParser(s, out result) ? (T?)result : null;
    }
}

// compiler error "'int.TryParse(string, out int)' is a 'method', which is not valid in the given context"
var result = int.TryParse.OrNull("1");  // int.TryParse.OrNull<int>("1"); doesnt work either

// compiler error: type cannot be infered....why?
var result2 = TryParseExtensions.OrNull(int.TryParse, "2"); 

// works as expected
var result3 = TryParseExtensions.OrNull<int>(int.TryParse, "3");
      var result4 = ((TryParseExtensions.TryParseMethod<int>)int.TryParse).OrNull("4");

Me pregunto dos cosas:

¿Por qué el compilador no puede inferir el parámetro de tipo "int"?

¿Entiendo correctamente que los métodos de extensiones no se descubren en los tipos de Delegado, ya que supongo que en realidad no son de ese tipo (pero son un "Método") que solo coinciden con la firma de los delegados? Como tal un elenco resuelve esto. ¿Sería inviable permitir que el escenario 1 funcione (no este específicamente, por supuesto, sino en general)? Supongo que desde el punto de vista del lenguaje / compilador, ¿sería realmente útil, o solo estoy (intentando) abusar salvajemente de las cosas aquí?

Esperando algunas ideas. Thnx

Respuestas a la pregunta(3)

Su respuesta a la pregunta