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
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.
Founder of Octal Solutions a .NET software house.
Passionate dev, blogger, occasionally speaker, one of the leaders of Wroc.NET user group. Microsoft MVP. Podcaster – Ostrapila.pl