Взрыв кода
Поскольку вопрос не о сгенерированном IL, а скорее о JIT-скомпилированном коде, вот небольшое обновление к моему ответу. Большая часть этого взята из CLR Джеффри Рихтера через C # .
Как вы уже указали, CLR генерирует собственный код для каждого отдельного параметра того же универсального типа, который называется Code Explosion . Но CLR может выполнить ряд оптимизаций, чтобы уменьшить сгенерированный собственный код в некоторых случаях, и одним из наиболее важных является то, что собственный код для TestClass<T>
может использоваться совместно для всех T
это ссылочные типы .
Вот почему:
CLR может выполнить эту оптимизацию, поскольку все аргументы ссылочного типа [...] действительно просто указатели [...] на объекты в куче, а указатели объектов все манипулируют одинаково .
¹
(выделено мое)
Итак, ключ к пониманию , почему один и тот же код может использоваться для ссылочных типов, но не для типов значений, заключается в том, что аргументы ссылочного типа являются указателями, а их размер не меняется, в то время как размер типов значений равен - поэтому для каждого типа значений должен быть сгенерирован собственный нативный код.
¹ CLR via C #, Jeffrey Richter, 4. ed, 2012, p.277