Ostatnimi czasy prześladowało mnie myśl o tym czy istnieje ograniczenie na liczbę zagnieżdżonych generic’ów w .NET. Jako, że pobieżne przeszukanie sieci nic mi nie pomogło postanowiłem sprawdzić. Jako, że nie planowałem tego zrobić ręcznie rozpocząłem od stworzenia transformaty XSLT, która przygotuje mi plik z definicją klasy w której będzie pole o typie generycznym.

    1 xml version=1.0 encoding=utf-8?>

    2 

    3 <xsl:stylesheet version=1.0

    4     xmlns:xsl=http://www.w3.org/1999/XSL/Transform>

    5   <xsl:output method=text encoding=utf-8 />

    6   <xsl:template name=Generics>

    7     <xsl:param name=n/>

    8     <xsl:if test=$n > 0 >

    9       <xsl:text disable-output-escaping=yes>List<xsl:text>

   10       <xsl:call-template name=Generics>

   11         <xsl:with-param name=n select=$n – 1 />

   12       xsl:call-template>

   13       <xsl:text disable-output-escaping=yes>>xsl:text>

   14     xsl:if>

   15     <xsl:if test=$n = 0>

   16       <xsl:text>doublexsl:text>

   17     xsl:if>

   18   xsl:template>

   19 

   20 <xsl:template match=/>

   21   <xsl:text>using System;

   22   using System.Collections.Generic;

   23   namespace TemplatesCountTest

   24   {

   25     class TestClass

   26     {

   27       static public

   28   xsl:text>

   29   <xsl:call-template name=Generics>

   30     <xsl:with-param name=n select=count/n />

   31   xsl:call-template>

   32   <xsl:text> l = new xsl:text>

   33   <xsl:call-template name=Generics>

   34     <xsl:with-param name=n select=count/n />

   35   xsl:call-template>

   36   <xsl:text>();

   37     }

   38   }xsl:text>

   39 xsl:template>

   40 xsl:stylesheet>

Oraz XML, na którym XSLT będzie operować:

    1 xml version=1.0 encoding=utf-8?>

    2 xml-stylesheet type=”text/xsl” href=”GenerateGenerics.xslt” ?>

    3 <count>

    4   <n>100n>

    5 count>

temu mogłem sobie generować dowolną liczbę zagnieżdżeń klasy List i próbować uruchamiać program z taką klasą. Pierwsze próby z liczbami 4,40,100 powodowały, iż program kompilował i uruchamiał się bez problemu. Jak się okazało później ostatni strzał był graniczny. Próby ustawiania n na 200 powodowały, iż w trakcie uruchamiania dostawałem TypeLoadException z komunikatem:

Rodzajowa konkretyzacja typu ‘System.Collections.Generic.List`1’ z zestawu ‘mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089’ była zbyt głęboka. Czy jest to typ rodzajowy zdefiniowany, czy używany rekurencyjnie?

Zatem ograniczenie na zagnieżdżenie klas generycznych jest na poziomie 100 elementów. Całkiem sporo. W C++ jest to chyba na poziomie kilkunastu elementów, ale w C++ jest to robione na etapie kompilacji, dzięki czemu możliwe jest coś takiego jak Meta Programming.