Diferencia entre interfaz como restricción de tipo e interfaz como parámetro?

Si quisiera crear un método que tome una instancia deIList como parámetro (o cualquier otra interfaz, pero usemosIList como ejemplo), podría crear un método genérico con una restricción de tipo, por ejemplo

public static void Foo1<T>(T list) where T : IList
{

}

Alternativamente, podría crear un método que tome unIList parámetro directamente:

public static void Foo2(IList list)
{

}

Para todos los efectos, parece que estos métodos se comportan exactamente igual:

List<string> myList = new List<string>();
Foo1(myList);
Foo2(myList);

Así que aquí está mi pregunta: ¿cuál es la diferencia entre estos dos enfoques? Parece que el segundo enfoque es un poco más legible; ¿Hay otras diferencias que debería tener en cuenta (se están generando diferentes IL, etc.)? Gracias por adelantado

Respuestas a la pregunta(5)

Su respuesta a la pregunta