인터넷 및 stackoverflow에 대한 몇 가지 기본 검색을 수행했는데 일반 버전 메서드와 비 제너릭 버전 메서드가 관련되어있을 때 과부하 해결에 대해 많은 논의를 보았습니다. 나는 과부하 reslolution 컴파일 시간에 이루어집니다 이해 -이 코드가 있으므로 경우 "InternalDoStuff"의 해상도가 컴파일러와 어떤 컴파일러에 의해 정리되어 있기 때문에일반 및 비 제너릭 메서드 사이의 C# 오버로드 해결
public class A<T>
{
public void DoStuff(T value)
{
InternalDoStuff(value);
}
protected void InternalDoStuff(int value)
{
Console.WriteLine("Non-generic version");
}
protected void InternalDoStuff(T value)
{
Console.WriteLine("Generic version");
}
}
public class Test
{
static void Main (string [] args)
{
A<int> a = new A<int>();
a.DoStuff(100);
}
}
가 출력 될 "일반 버전"됩니다 "InternalDoStuff는 DoStuff에서 T 유형 매개 변수로 호출됩니다."입니다.
public class B : A <int>
{
}
public class Test
{
static void Main (string [] args)
{
B b = new B();
b.DoStuff(100);
}
}
지금 내가 그 컴파일러는 "B는 특정 버전"을 결정하기에 충분한 정보를 가지고 말할 수있는, 따라서 제네릭이 아닌 버전을 호출 :이 어떤 변화를 가져올 것인지 잘 모릅니다 그러나
InternalDoStuff?
이러한 종류의 과부하 해결을 분석하는 데 일반적인 원칙이 있습니까?
첫 번째 질문 - "컴파일러에 비 제네릭 버전을 호출하기위한 충분한 정보가 있다고 할 수 있습니까?" - 스스로 시도하여 대답 할 수 있습니다. 두 번째 질문은 C# 사양의 오버로드 해결 섹션을 읽음으로써 답변을 얻을 수 있습니다. –