로컬 함수와 관련된 오류 및 경고 해결

이 문서에서는 다음 컴파일러 오류 및 경고를 설명합니다.

  • CS8108: 동적 형식의 인수를 로컬 함수 'method'의 매개 변수 'parameter'에 전달할 수 없습니다.
  • CS8112: 로컬 함수 'method'는 'static extern'으로 표시되지 않으므로 본문을 선언해야 합니다.
  • CS8321: 로컬 함수 'method'가 선언되었지만 사용되지 않습니다.
  • CS8421: 정적 로컬 함수는 'variable'에 대한 참조를 포함할 수 없습니다.
  • CS8422: 정적 로컬 함수는 'this' 또는 'base'에 대한 참조를 포함할 수 없습니다.

로컬 함수가 C# 7.0에 추가되었습니다. 다른 멤버 내에서 도우미 메서드를 선언할 수 있습니다. 이 문서의 진단에서는 로컬 함수 선언, 호출, 사용량 및 로컬 함수에 대한 static 추가 캡처 제한 사항을 다룹니다.

로컬 함수 본문

  • CS8112: 로컬 함수 'method'는 'static extern'으로 표시되지 않으므로 본문을 선언해야 합니다.

로컬 함수가 선언 static extern되지 않는 한 로컬 함수 선언에는 본문이 포함되어야 합니다. 로컬 함수에 블록 본문 또는 식 본문을 추가합니다. 구현이 외부에서 제공된 경우 로컬 함수 static extern 를 표시하고 선언이 외부 메서드에 대한 규칙을 따르는지 확인합니다.

params 매개 변수 및 동적 인수

  • CS8108: 동적 형식의 인수를 로컬 함수 'method'의 매개 변수 'parameter'에 전달할 수 없습니다.

로컬 함수 호출은 인수를 dynamic 매개 변수에 params 전달할 수 없습니다. 호출 전에 매개 변수에서 예상하는 요소 형식 또는 배열 형식으로 params 값을 변환합니다. 명시적으로 형식화된 배열에 값을 저장하고 해당 배열을 로컬 함수에 전달할 수도 있습니다.

사용되지 않는 로컬 함수

  • CS8321: 로컬 함수 'method'가 선언되었지만 사용되지 않습니다.

컴파일러는 로컬 함수를 선언할 때 이 경고를 보고하지만 연결할 수 있는 코드는 호출하지 않습니다. 사용되지 않는 로컬 함수를 제거하거나 바깥쪽 멤버에서 호출합니다. 향후 변경 시 로컬 함수를 사용하려는 경우 필요할 때까지 원본에서 제외합니다.

정적 로컬 함수가 상태를 캡처할 수 없음

  • CS8421: 정적 로컬 함수는 'variable'에 대한 참조를 포함할 수 없습니다.
  • CS8422: 정적 로컬 함수는 'this' 또는 'base'에 대한 참조를 포함할 수 없습니다.

로컬 함수는static 바깥쪽 범위에서 상태를 캡처할 수 없습니다. this를 통해 바깥쪽 지역 변수, 매개 변수 또는 인스턴스 멤버를 참조할 수 없으며, this 자신도 참조할 수 없습니다. 로컬 함수에 필요한 각 값을 매개 변수로 전달합니다(CS8421, CS8422). 로컬 함수가 바깥쪽 범위에서 변수 또는 인스턴스 상태를 캡처해야 하는 경우 한정자를 static 제거합니다.

다음 예제에서는 CS8422를 발생시키는 참조를 보여 줍니다.

public class C
{
    private int counter = 1;

    public void IncreaseCounter()
    {
        static void LocalFunc(int addition)
        {
            this.counter += addition;   // CS8422
            base.ToString();            // CS8422

            counter += addition;        // CS8422: implicit this
            ToString();                 // CS8422: implicit base
        }

        LocalFunc(10);
    }
}

CS8422를 수정하려면 필요한 인스턴스 데이터를 로컬 함수에 전달하거나, 도우미를 인스턴스 컨텍스트 외부로 이동하거나, 로컬 함수가 인스턴스 상태에 액세스해야 하는 경우 제거 static 합니다.