Métodos de extensión con genéricos

Estaba mirando aest pregunta y tenía curiosidad por qué esto no se compil

Dado este código, ¿alguien puede explicar por qué la llamada aIBase.Test() no resuelve el método de extensión correcto?

public interface IBase { }

public interface IChildA : IBase { }

public interface IChildB : IBase { }

public static class BaseExtensions
{
    public static IBase Test(this IBase self) { return self; }
    public static T Test<T>(this T self) where T : IChildB { return self; }
}

public static class TestClass
{
    public static void Test()
    {
        IChildA a = null; //Yeh i know its null but just testing for compile here..
        IBase firstTry = a.Test();  //Cannot resolve to BaseExtensions.Test(this IBase obj)
        IBase secondTry = ((IBase)a).Test();  //Resolves to BaseExtensions.Test(this IBase obj)

        IChildB b = null;
        IChildB touchedB = b.Test();
    }
}

El error que obtengo es

Error 166 The type 'IChildA' cannot be used as type parameter 'T' in the generic type or method 'BaseExtensions.Test<T>(T)'. There is no implicit reference conversion from 'IChildA' to 'IChildB'.

Tenía la sensación de que es porque sería ambiguo para cualquier cosa que implementeIChildB y no sabría qué método de extensión usar, pero el mensaje de error no se queja de ese lado y si elimina laIBase firstTry = a.Test(); línea, entonces se compila bien ..

Respuestas a la pregunta(1)

Su respuesta a la pregunta