Dlaczego deklaracja pola ze zduplikowanym typem zagnieżdżonym w klasie ogólnej powoduje ogromny wzrost kodu źródłowego?

Scenariusz jest bardzo rzadki, ale dość prosty: definiujesz klasę ogólną, a następnie tworzymy klasę zagnieżdżoną, która dziedziczy z klasy zewnętrznej i definiuje pole asocjacyjne (typu własnego) wewnątrz zagnieżdżonego. Fragment kodu jest prostszy niż opis:

class Outer<T>
{
    class Inner : Outer<Inner>
    {
        Inner field;
    }
}

po dekompilacji IL kod C # wygląda tak:

internal class Outer<T>
{
    private class Inner : Outer<Outer<T>.Inner>
    {
        private Outer<Outer<T>.Inner>.Inner field;
    }
}

Wydaje się to dość sprawiedliwe, ale kiedy zmienisz deklarację typu pola, sprawy staną się trudniejsze. Więc kiedy zmieniam deklarację pola na

Inner.Inner field;

Po dekompilacji to pole będzie wyglądać następująco:

private Outer<Outer<Outer<T>.Inner>.Inner>.Inner field;

Rozumiem, że „zagnieżdżanie” klas i dziedziczenie nie pasują do siebie, aledlaczego obserwujemy takie zachowanie? Jest Inner.Inner deklaracja typu w ogóle zmieniła typ? Są Inner.Inner i Inner w tym kontekście różnią się w jakiś sposób?

Kiedy sprawy stają się bardzo trudne

Możesz zobaczyćdekompilowany kod źródłowy dla klasy poniżej. Jest naprawdę ogromny i ma całkowitą długość 12159 symboli.

class X<A, B, C>
{
    class Y : X<Y, Y, Y>
    {
        Y.Y.Y.Y.Y.Y y;
    }
} 

Wreszcie ta klasa:

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;
    }
}

prowadzi do27.9 MB (29,302,272 bytes) montaż iTotal build time: 00:43.619

Narzędzia użyte

Kompilacja odbywa się w kompilatorach C # 5 i C # 4. Dekompilacja jest wykonywana przez dotPeek. Buduj konfiguracje:Release iDebug

questionAnswers(3)

yourAnswerToTheQuestion