Cette question me demandais où le béton implementaiton d'une méthode générique en fait vient à l'existence. J'ai essayé google mais je ne suis pas à venir avec la bonne recherche.
Si nous prenons cet exemple simple:
class Program
{
public static T GetDefault<T>()
{
return default(T);
}
static void Main(string[] args)
{
int i = GetDefault<int>();
double d = GetDefault<double>();
string s = GetDefault<string>();
}
}
dans ma tête j'ai toujours supposé qu'à un certain point, il en résulte une mise en œuvre avec les 3 nécessaires des implémentations concrètes telles que, dans naïf pseudo mangling, nous aurions cette logique de béton implementaiton où la spécificité des types utilisés résultat dans la pile correct allocations etc.
class Program
{
static void Main(string[] args)
{
int i = GetDefaultSystemInt32();
double d = GetDefaultSystemFloat64();
string s = GetDefaultSystemString();
}
static int GetDefaultSystemInt32()
{
int i = 0;
return i;
}
static double GetDefaultSystemFloat64()
{
double d = 0.0;
return d;
}
static string GetDefaultSystemString()
{
string s = null;
return s;
}
}
En regardant le IL pour le générique, il est toujours exprimée en termes de types génériques:
.method public hidebysig static !!T GetDefault<T>() cil managed
{
// Code size 15 (0xf)
.maxstack 1
.locals init ([0] !!T CS$1$0000,
[1] !!T CS$0$0001)
IL_0000: nop
IL_0001: ldloca.s CS$0$0001
IL_0003: initobj !!T
IL_0009: ldloc.1
IL_000a: stloc.0
IL_000b: br.s IL_000d
IL_000d: ldloc.0
IL_000e: ret
} // end of method Program::GetDefault
Alors, comment et à quel point il a été décidé qu'un int, puis un double, puis une chaîne doivent être alloués sur la pile et retournée à l'appelant? Est-ce une opération de l'équipe? Je suis à la recherche dans le complètement faux de la lumière?