수색…


비고

과부하 해결 프로세스는 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.0int 암시 적으로 변환 할 방법이 없기 때문에 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 을 출력합니다. 메서드 Methodparams 라는 키워드를 가지고 있지 않은 것처럼, 정상적인 형태가 아닌 일반적인 형태가 항상 우선권을 가지므로, 프로그램은 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);


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow