Вначале в языке C# были определены лишь классы коллекций, которые сохраняли объекты любого класса. Это были классы ArrayList, Stack и Queue. Перечисленные классы принесли те же проблемы, что и классы коллекций языка Java. Родовые классы были добавлены в 2005 году. Пятью предопределенными родовыми коллекциями стали Array, List, Stack, Queue и Dictionary (класс Dictionary реализует хеши). Данные классы устранили проблемы, связанные со смешиванием типов в коллекциях и необходимостью явного приведения объектов при извлечении из коллекций. Пользователи тоже могут определять родовые классы. При этом в пользовательских родовых коллекциях разрешается индексация элементов (доступ через индексы). Чаще всего используются целочисленные индексы, но в качестве индексов можно применять и строки. К сожалению, подстановочных классов в языке C# нет.