Разница между интерфейсом как ограничением типа и интерфейсом как параметром?

Если бы я хотел создать метод, принимающий в качестве параметра экземпляр IList (или любого другого интерфейса, но в качестве примера возьмем IList), я мог бы создать общий метод с ограничением типа, например. :

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

}

В качестве альтернативы я могу создать метод, который принимает IList параметр напрямую:

public static void Foo2(IList list)
{

}

Для всех намерений и целей, кажется, что эти методы ведут себя абсолютно одинаково:

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

Так вот мой вопрос - в чем разница между этими двумя подходами? Кажется, что второй подход немного более читабелен; есть ли какие-либо другие различия, о которых я должен знать (различные IL генерируются и т.д.)? Заранее спасибо.

13
задан Qantas 94 Heavy 1 May 2014 в 09:10
поделиться