¿Por qué las restricciones de tipo no son parte de la firma del método?

Así que leíEric Lippert 'Las restricciones no son parte de la firma', y ahora entiendo que la especificación especifica que las restricciones de tipo se verifican DESPUÉS de la resolución de sobrecarga, pero aún no estoy claro por qué DEBE ser así. A continuación se muestra el ejemplo de Eric:

static void Foo<T>(T t) where T : Reptile { }
static void Foo(Animal animal) { }
static void Main() 
{ 
    Foo(new Giraffe()); 
}

Esto no se compila porque la resolución de sobrecarga para:Foo(new Giraffe()) infiere queFoo<Giraffe> es la mejor coincidencia de sobrecarga, pero las restricciones de tipo fallan y se genera un error en tiempo de compilación. En palabras de Eric:

El principio aquí es la resolución de sobrecarga (y la inferencia de tipo de método) para encontrar la mejor coincidencia posible entre una lista de argumentos y la lista de parámetros formales de cada método candidato. Es decir, miran la firma del método candidato.

as restricciones @Type NO son parte de la firma, pero ¿Por qué no pueden ser? ¿Cuáles son algunos escenarios en los que es una mala idea considerar las restricciones de tipo parte de la firma? ¿Es difícil o imposible de implementar? No estoy abogando por que si la sobrecarga mejor elegida es por alguna razón imposible de llamar, entonces recurra silenciosamente a la segunda mejor; Yo odiaría eso. Solo estoy tratando de entender por qué las restricciones de tipo no se pueden usar para influir en la elección de la mejor sobrecarga.

Me imagino que internamente en el compilador de C #, solo para propósitos de resolución de sobrecarga (no reescribe permanentemente el método), el seguimiento

static void Foo<T>(T t) where T : Reptile { }

gets transformado en:

static void Foo(Reptile  t) { }

¿Por qué no puede "introducir" las restricciones de tipo en la lista de parámetros formales? ¿Cómo cambia esto la firma de alguna manera mala? Siento que solo fortalece la firma. LuegoFoo<Reptile> nunca será considerado como un candidato de sobrecarga.

Edit 2: No es de extrañar que mi pregunta fuera tan confusa. No leí correctamente el blog de Eric y cité el ejemplo incorrecto. He editado en el ejemplo que creo más apropiado. También he cambiado el título para que sea más específico. Esta pregunta no parece tan simple como la imaginé por primera vez, tal vez me falta algún concepto importante. Estoy menos seguro de que este es un material de stackoverflow, puede ser mejor que esta pregunta / discusión se traslade a otra parte.

Respuestas a la pregunta(4)

Su respuesta a la pregunta