Почему объявление поля с дублированным вложенным типом в универсальном классе приводит к значительному увеличению исходного кода?
Сценарий очень редкий, но довольно простой: вы определяете универсальный класс, затем создаете вложенный класс, который наследуется от внешнего класса, и определяете ассоциативное поле (собственного типа) внутри вложенного. Фрагмент кода проще, чем описание:
class Outer<T>
{
class Inner : Outer<Inner>
{
Inner field;
}
}
после декомпиляции IL код C # выглядит так:
internal class Outer<T>
{
private class Inner : Outer<Outer<T>.Inner>
{
private Outer<Outer<T>.Inner>.Inner field;
}
}
Это кажется достаточно справедливым, но когда вы меняете объявление типа поля, все становится сложнее. Поэтому, когда я изменяю объявление поля на
Inner.Inner field;
После декомпиляции это поле будет выглядеть так:
private Outer<Outer<Outer<T>.Inner>.Inner>.Inner field;
Я понимаю, что классовая «вложенность» и наследование не вполне уживаются друг с другом, нопочему мы наблюдаем такое поведение? Это Inner.Inner
объявление типа изменило тип вообще? Находятся Inner.Inner
а также Inner
типы отличаются в этом контексте?
Вы можете увидетьдекомпилированный исходный код для класса ниже. Это действительно огромный и имеет общую длину 12159 символов.
class X<A, B, C>
{
class Y : X<Y, Y, Y>
{
Y.Y.Y.Y.Y.Y y;
}
}
Наконец, этот класс:
class X<A, B, C, D, E>
{
class Y : X<Y, Y, Y, Y, Y>
{
Y.Y.Y.Y.Y.Y.Y.Y.Y y;
}
}
результаты в27.9 MB (29,302,272 bytes)
сборка иTotal build time: 00:43.619
Компиляция выполняется в компиляторах C # 5 и C # 4. Декомпиляция выполняется dotPeek. Конфигурации сборки:Release
а такжеDebug