Просто пытаюсь разобраться в Generics, прочитав эта поучительная статья Жюваля Лоуи
Перефразирование .. Когда вы определяете определение универсального класса, оно компилируется в IL.
MyList<int>Преимущество: Отсутствие штрафов за бокс и распаковку.MyList<String>Теперь до дженериков мы могли бы написать методы, принимающие параметры Object. Generics заявляет об улучшении производительности на 100%, потому что 'это позволяет избежать потери производительности, которую вы понесете, когда вы понижаете тип объекта до вашего конкретного типа, когда вы хотите его использовать '
// assume GetItem returns an Object
string sMyPreciousString = (string) obList.GetItem();
Что это за удар по производительности при переходе от объекта к конкретному ссылочному типу? Также кажется, что преобразование в Object (даже Generics сделало бы это) не снижает производительности ... почему?

Приведение к объекту не требует проверки времени выполнения - оно всегда будет работать и, по сути, не требует никаких действий.
Для понижающего преобразования требуется проверка времени выполнения, чтобы убедиться, что вы, например, не преобразуете Stream в String. Это довольно небольшое наказание, и маловероятно, что оно станет узким местом, но его предотвращение - лишь одно дополнительное преимущество для дженериков.
Падение производительности связано с необходимостью проверки типа во время выполнения. Если B является подклассом A, то, когда вы преобразуете B в A, вы знаете во время компиляции, что это будет безопасно, поскольку все B - это As. Следовательно, вам не нужно создавать какой-либо код времени выполнения для проверки типа.
Однако, когда вы преобразуете A в B, вы не знаете во время компиляции, является ли A на самом деле B или нет. Это может быть просто A, это может быть тип C, другой подтип A. Следовательно, вам необходимо сгенерировать код времени выполнения, который будет проверять, действительно ли объект является B, и генерировать исключение, если это не так.
Дженерики не имеют этой проблемы, потому что во время компиляции компилятор знает, что в структуру данных были помещены только B, поэтому, когда вы что-то извлекаете, компилятор знает, что это будет B, поэтому нет необходимости в проверка типа во время выполнения.
Просто, когда вы это знаете ... простой IL instr позволяет повысить производительность на 100% :)