Почему объявление поля с дублированным вложенным типом в универсальном классе приводит к значительному увеличению исходного кода?

Сценарий очень редкий, но довольно простой: вы определяете универсальный класс, затем создаете вложенный класс, который наследуется от внешнего класса, и определяете ассоциативное поле (собственного типа) внутри вложенного. Фрагмент кода проще, чем описание:

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

Ответы на вопрос(3)

Ваш ответ на вопрос