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 필요한 구체적인 구현과 구현을 초래한다고 가정 한
등, 그 순진한 의사 맹 글링에서, 우리 특정 유형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 찾고 올바른 스택 할당 등의 결과를 사용하여이 논리 콘크리트 implementaiton을 가질 것이다 :
.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이 제네릭을 지원합니다. 커다란 진전은 이미 컴파일 된 어셈블리의 클래스가 여전히 generics를 지원한다는 것입니다. _ (전체 .NET 프레임 워크와 유사) _ –
@Jonathan Wood 전적으로 C++에서 메소드 이름을 변경하는 방법의 관점에서이를 살펴 봅니다! – dkackman