最佳答案
这个问题让我想知道泛型方法的具体实现实际上是从哪里来的。我已经试过谷歌,但没有想出正确的搜索。
如果我们举个简单的例子:
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 和一个字符串并返回给调用者的呢?这是一个 JIT 过程的操作吗?我是不是完全想错了?