Введение в обобщённые типы в C#
Обобщённый тип описывает класс или метод один раз
и не закрепляет его за int, string или другим
конкретным типом. На месте типа стоит параметр. Обычно
его называют T. При использовании компилятор
подставляет вместо T нужный тип и проверяет, что
он везде один и тот же.
Так устроен список из основного учебника. List<int>
хранит числа, List<string> - строки. Класс списка
один, в угловых скобках указан тип элемента. Строку в
список чисел положить нельзя: компилятор уже знает, какой
тип там допустим.
Без такого параметра одну операцию копируют под каждый тип:
отдельный метод для int, отдельный для double,
отдельный для string. Правку потом вносят в каждую
копию. Метод с параметром object копирование убирает,
но тип проверяется только при запуске, когда значение
приводят к нужному типу. Неподходящий аргумент компилятор
пропускает.
Обобщение соединяет оба свойства. Объявление одно, как у
метода с object, а тип проверяется при компиляции,
как у отдельных копий. Для чисел параметр становится
int, для строк - string.
Пока про T ничего больше не сказано, с ним можно
только то, что верно для любого типа: сохранить значение,
передать его дальше и вернуть из метода. Сложить два
значения T или прочитать длину нельзя. У
произвольного типа таких операций нет.