Что такое обобщенный тип (дженерик) в C#
Что проверяют
Знаете ли вы дженерики глубже синтаксиса угловых скобок. В C# за темой сразу тянутся ограничения типов, поведение среды выполнения и вариантность, и собеседование обычно уходит именно туда.
Как отвечать
Обобщённый тип это тип, параметризованный другим типом: класс, интерфейс, структура, метод или делегат, написанные один раз и работающие с любым подставленным типом без приведений.
Три вещи отличают сильный ответ.
Ограничения. Параметр почти никогда не бывает совсем свободным: where T : class, struct, notnull, new(), конкретный базовый класс или интерфейс. Они не только защищают от неправильного применения, но и открывают доступ к членам типа внутри обобщённого кода.
public sealed class Repository<T> where T : class, IEntity, new()
{
private readonly List<T> items = new();
public T Add() { var e = new T(); items.Add(e); return e; }
}Поведение в среде выполнения. В отличие от языков со стиранием типов, здесь обобщения существуют и после компиляции: для каждого значимого типа среда создаёт отдельный машинный код, для ссылочных переиспользует общий. Отсюда и типобезопасность без приведений, и отсутствие упаковки значимых типов, и то, что закрытые типы одного обобщённого класса это разные типы со своими статическими полями.
Вариантность. Обобщённые интерфейсы и делегаты объявляют параметр как out или in, поэтому последовательность строк присваивается переменной типа последовательности объектов, а список строк нет: у классов вариантности не бывает.
Где спотыкаются
Объясняют дженерики через одну лишь экономию на приведении типов и не могут назвать ни одного ограничения. Вопрос про where следует почти всегда.
Ждут от обобщённого кода специализации по типу. Проверка вида if (typeof(T) == typeof(int)) внутри метода обычно означает, что вместо дженерика нужны перегрузки или отдельная реализация.
Считают, что коллекция производного типа подойдёт везде, где ждут коллекцию базового. Это верно для интерфейсов с ковариантным параметром и только на чтение, а массивы, у которых такая подстановка исторически разрешена, платят за неё исключением уже во время выполнения.