이 문서에서는 다음 컴파일러 오류 및 경고를 설명합니다.
- 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 합니다.
관련 진단
- 식 트리의 로컬 함수에 대한 자세한 내용은 C# 컴파일러 메시지 의 식 트리에서 일부 식이 금지되어 있음을 참조하세요.
- 제네릭 형식 매개 변수를 사용하는 로컬 함수에 대한 자세한 내용은 C# 컴파일러 메시지의 제네릭 형식 매개 변수 및 형식 인수와 관련된 오류 및 경고 해결 을 참조하세요.
- 로컬 함수의 특성에 대한 자세한 내용은 C# 컴파일러 메시지의 코드에서 특성 선언 및 특성 사용을 포함하는 오류 및 경고 해결 을 참조하세요.
- 익명 함수에서 캡처된 변수에 대한 자세한 내용은 C# 컴파일러 메시지의 람다 식 오류 및 경고를 참조하세요.
- 생성자 및 기본 생성자의 캡처에 대한 자세한 내용은 C# 컴파일러 메시지의 생성자 선언 및 모듈 이니셜라이저와 관련된 오류 해결 을 참조하세요.
.NET