This question让我想知道一个通用方法的具体实现在哪里实际存在。我试过谷歌,但没有提出正确的搜索。泛型方法如何,何时何地使混凝土变为混凝土?
如果我们把这个简单的例子:
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个必需的具体实现,例如,在天真的伪忙玲,我们本来这个逻辑具体implementaiton在特定类型的使用导致了正确的堆栈分配等
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过程的一个操作吗?我是否完全错误地看待这个问题?
和我一样,你似乎正在用C++术语思考这个问题。我不知道答案,但回想一下在C#中关于泛型的一些意想不到的事实。 –
你看起来不错,IL支持泛型。伟大的进步是已编译的程序集中的类仍然支持泛型。 _(像整个.NET框架)_ –
@Jonathan Wood完全从C++如何修改方法名称的角度来看待这个问题! – dkackman