この質問により、ジェネリック メソッドの具体的な実装が実際に存在する場所について疑問に思いました。私はグーグルを試しましたが、正しい検索が思いつきません。
この簡単な例を挙げると:
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>();
}
}
私の頭の中では、ある時点で必要な3つの具象実装を備えた実装が得られると常に想定しており、単純な疑似マングリングでは、使用される特定の型が正しいスタック割り当てなどをもたらすこの論理的具象実装が得られます。 .
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;
}
}
ジェネリック プログラムの IL を見ると、まだジェネリック型で表現されています。
.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
では、どのように、どの時点で、int、次に double、次に string をスタックに割り当て、呼び出し元に返す必要があると判断されるのでしょうか? これは JIT プロセスの操作ですか? 私はこれを完全に間違った見方で見ていますか?