문제

다음 코드를 시도했습니다.

class Program: ProgParent
    {

        public int Max(params int[] op)
        {
            return 0;
        }

        public int Max(int i, params int[] op)
        {
            return 1;
        }

        public int Max(int i, int j, params int[] op)
        {
            return 2;
        }

        public static void Main(string[] args)
        {
            System.Console.WriteLine((new Program()).Max(5, 6, 7, 8));
            System.Console.ReadKey();
        }
    }

사용 가능한 가장 구체적인 기능을 실행하고 사용합니다. 그러나 컴파일러는 이것에 대해 경고 나 오류를 제공하지 않습니다. 왜요?

도움이 되었습니까?

해결책

C# 언어 사양은 말합니다.

오버로드 해상도를 수행 할 때 매개 변수 배열이있는 메소드는 일반적인 형태 [즉, 배열 전달] 또는 확장 된 양식 [즉 변수 수의 매개 변수를 전달하는 확장 된 형태]으로 적용 할 수 있습니다. 메소드의 확장 된 형태는 메소드의 정상적인 형태를 사용할 수없는 경우에만 사용할 수 있으며 확장 된 양식과 동일한 서명이있는 메소드가 이미 동일한 유형으로 선언되지 않은 경우에만 사용할 수 있습니다. "

(약간 단순화 된) 간단한 간단한 점 : 과부하 분해능이 모호한 경우 컴파일러는 비 PARAMS 과부하를 선택합니다.

나는 그 결정에 대한 이유 (당신의 것과 같은 코드를 불법으로 만드는 대신)는 다음을 포함한다고 생각합니다.

  • 메소드에 서명이있는 경우 : void fn (params object [] p)이있는 경우 (객체를 전달하여) "일반 양식"을 호출하는 방법이 필요합니다. 따라서 컴파일러는 어쨌든 모호한 케이스를 처리해야합니다.
  • 임시 어레이를 만드는 것은 메소드 호출보다 훨씬 비싸므로 동일하지만 더 효율적인 1,2,3 개의 매개 변수로 비석이 아닌 오버로드를 만들 수 있습니다. (예 : string.format처럼)

다른 팁

빌드 오류를 무시하고 (오타에 내려 놓는) - 어떤 경고를 기대하거나 원하십니까? 일치하는 과부하를 찾고 사용하고 있습니다 ...

엄밀히 말하면, 배열을 전달하여 다른 과부하를 호출 할 수 있지만 예, 사용법은 완전히 명확하지 않습니다.

다중 오버로드없이 params,이 패턴은 string.Concat 등 (밑줄 + 보닛 아래의 문자열의 경우).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top