C# Language
과부하 해결
수색…
비고
과부하 해결 프로세스는 C # 사양 7.5.3 절에 설명되어 있습니다. 7.5.2 (유형 유추) 및 7.6.5 (호출 표현식) 섹션도 관련이 있습니다.
과부하 해결 작업은 C # 7에서 변경 될 것입니다. 디자인 노트에 따르면 Microsoft는 어떤 방법이 더 복잡한 지 (복잡한 시나리오에서) 결정하기위한 새로운 시스템을 출시 할 예정입니다.
기본 오버로드 예제
이 코드에는 Hello 라는 오버로드 된 메서드가 포함되어 있습니다.
class Example
{
public static void Hello(int arg)
{
Console.WriteLine("int");
}
public static void Hello(double arg)
{
Console.WriteLine("double");
}
public static void Main(string[] args)
{
Hello(0);
Hello(0.0);
}
}
Main 메서드가 호출되면 인쇄됩니다.
int
double
컴파일시에 컴파일러가 Hello(0)
메서드 호출을 찾으면 Hello
라는 이름의 모든 메서드를 찾습니다. 이 경우에는 두 가지가 있습니다. 그런 다음 어떤 방법이 더 나은지 결정하려고합니다. 어떤 방법이 더 좋은지 결정하는 알고리즘은 복잡하지만 일반적으로 가능한 한 암시 적 변환을 거의하지 않습니다.
따라서 Hello(0)
의 경우 Hello(int)
메서드에는 변환이 필요하지 않지만 Hello(double)
메서드에는 암시 적 숫자 변환이 필요합니다. 따라서 첫 번째 방법은 컴파일러가 선택합니다.
Hello(0.0)
의 경우 0.0
을 int
암시 적으로 변환 할 방법이 없기 때문에 Hello(int)
메서드는 오버로드 해결을 고려하지 않습니다. 메서드 만 남아 있으므로 컴파일러에서 선택합니다.
"params"는 필요하지 않으면 확장되지 않습니다.
다음 프로그램 :
class Program
{
static void Method(params Object[] objects)
{
System.Console.WriteLine(objects.Length);
}
static void Method(Object a, Object b)
{
System.Console.WriteLine("two");
}
static void Main(string[] args)
{
object[] objectArray = new object[5];
Method(objectArray);
Method(objectArray, objectArray);
Method(objectArray, objectArray, objectArray);
}
}
인쇄 할 것입니다 :
5
two
3
호출 식 Method(objectArray)
는 두 가지 방법으로 해석 될 수 있습니다. 하나의 Object
인수가 배열이됩니다. (따라서 프로그램은 인수의 수 또는 인수의 배열이 될 수 있으므로 1
을 출력합니다. 메서드 Method
가 params
라는 키워드를 가지고 있지 않은 것처럼, 정상적인 형태가 아닌 일반적인 형태가 항상 우선권을 가지므로, 프로그램은 5
출력합니다.
두 번째 표현식 인 Method(objectArray, objectArray)
에서 첫 번째 메서드의 확장 된 형식과 일반적인 두 번째 메서드가 모두 적용 가능합니다. 이 경우에도 확장되지 않은 형식이 우선하므로 프로그램에서 two
인쇄합니다.
세 번째 표현식 인 Method(objectArray, objectArray, objectArray)
에서 유일한 옵션은 첫 번째 메서드의 확장 된 형식을 사용하는 것이므로 프로그램에서 3
인쇄합니다.
인수 중 하나로서 null 전달
당신이 가지고 있다면
void F1(MyType1 x) {
// do something
}
void F1(MyType2 x) {
// do something else
}
어떤 이유로 F1
의 첫 번째 오버로드를 호출해야하지만 x = null
인 경우 간단히
F1(null);
호출이 모호하므로 컴파일되지 않습니다. 이것을 막기 위해 당신은 할 수 있습니다.
F1(null as MyType1);