This question mi ha fatto riflettere su dove l'implementazione concreta di un metodo generico viene effettivamente all'esistenza. Ho provato il google, ma non mi viene in mente la ricerca giusta.Come, quando e dove i metodi generici sono resi concreti?
Se prendiamo questo semplice esempio:
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>();
}
}
nella mia testa ho sempre pensato che a un certo punto si traduce in un'implementazione con le 3 necessarie implementazioni concrete in modo tale che, nel ingenua pseudo mangling, abbiamo sarebbe questo implementaiton concreta logica in cui i tipi specifici risultato utilizzati nelle allocazioni dello stack corretti ecc
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;
}
}
Guardando il iL per il programma generico è ancora espresso in termini di tipi generici:
.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
Quindi come ea che punto è deciso che un int, e quindi un double e quindi una stringa devono essere allocati nello stack e restituiti al chiamante? Questa è un'operazione del processo JIT? Sto guardando questo nella luce completamente sbagliata?
Come me, sembra che tu stia pensando a questo in termini C++. Non conosco la risposta, ma ricordo di aver letto alcuni fatti inaspettati sui generici in C#. –
Stai cercando bene, IL supporta i generici. Il grande progresso è che le classi negli assembly già compilati supportano ancora i generici. _ (come l'intero framework .NET) _ –
@Jonathan Wood Guardando tutto questo dal punto di vista di come i nomi dei metodi del mangano C++! – dkackman