몇 가지 오류 는 람다 식 및 익명 메서드 선언 및 사용과 관련이 있습니다.
- CS0407: 'method'에 잘못된 반환 형식이 있습니다.
- CS0428: 메서드 그룹 'Identifier'를 대리자가 아닌 형식 'type'으로 변환할 수 없습니다. 메서드를 호출하려고 했나요?
- CS0748: 일치하지 않는 람다 매개 변수 사용량; 매개 변수 형식은 모두 명시적이거나 모든 암시적이어야 합니다.
- CS0815: 암시적으로 형식화된 변수에 'expression'을 할당할 수 없습니다.
- CS0828: 익명 형식 속성에 'expression'을 할당할 수 없습니다.
- CS0837: 'is' 또는 'as' 연산자의 첫 번째 피연산자는 람다 식, 무명 메서드 또는 메서드 그룹이 아닐 수 있습니다.
- CS1065: 기본값은 이 컨텍스트에서 유효하지 않습니다.
- CS1621: yield 문은 무명 메서드 또는 람다 식 내에서 사용할 수 없습니다.
-
CS1628: 익명 메서드, 람다 식 또는 쿼리 식 내에서 사용하거나
in매개 변수를 사용할refout수 없습니다. - CS1632: 컨트롤은 무명 메서드 또는 람다 식의 본문을 그대로 둘 수 없습니다.
- CS1643: 모든 코드 경로가 'type' 형식의 무명 메서드에서 값을 반환하는 것은 아닙니다.
- CS1660: 대리자 형식이 아니므로 람다 식을 'type' 형식으로 변환할 수 없습니다.
- CS1661: 매개 변수 형식이 대리자 매개 변수 형식과 일치하지 않으므로 무명 메서드 블록을 'type' 형식으로 변환할 수 없습니다.
- CS1662: 블록의 일부 반환 형식은 대리자 반환 형식으로 암시적으로 변환할 수 없으므로 무명 메서드 블록을 의도한 대리자 형식으로 변환할 수 없습니다.
- CS1673: 구조체 내의 익명 메서드, 람다 식 및 쿼리 식은 'this'의 인스턴스 멤버에 액세스할 수 없습니다.
- CS1676: 'number' 매개 변수는 'keyword' 키워드를 사용하여 선언해야 합니다.
- CS1677: 'number' 매개 변수는 'keyword' 키워드로 선언하면 안 됩니다.
- CS1678: 매개 변수 'number'는 'type1' 형식으로 선언되지만 'type2'여야 합니다.
- CS1686: 지역 변수 또는 해당 멤버는 익명 메서드 또는 람다 식 내에서 주소를 가져와 사용할 수 없습니다.
- CS1688: 하나 이상의 out 매개 변수가 있으므로 매개 변수 목록이 없는 무명 메서드 블록을 대리자 형식 'delegate'로 변환할 수 없습니다.
- CS1706: 식은 익명 메서드 또는 람다 식을 포함할 수 없습니다.
- CS1731: 블록의 일부 반환 형식은 대리자 반환 형식으로 암시적으로 변환할 수 없으므로 식을 대리자로 변환할 수 없습니다.
- CS1732: 예상 매개 변수입니다.
- CS1764: 익명 메서드, 람다 식 또는 쿼리 식 내에서 고정된 로컬을 사용할 수 없습니다.
- CS8030: void 반환 대리자로 변환된 익명 함수는 값을 반환할 수 없습니다.
- CS8175: 익명 메서드, 람다 식 또는 쿼리 식 내에서 ref 로컬을 사용할 수 없습니다.
- CS8820: 정적 익명 함수는 'variable'에 대한 참조를 포함할 수 없습니다.
- CS8821: 정적 익명 함수는 'this' 또는 'base'에 대한 참조를 포함할 수 없습니다.
- CS8916: 람다 식의 특성에는 괄호가 있는 매개 변수 목록이 필요합니다.
- CS8917: 대리자 형식을 유추할 수 없습니다.
- CS8934: 반환 형식이 대리자 반환 형식과 일치하지 않으므로 anonymous 메서드를 'type' 형식으로 변환할 수 없습니다.
-
CS8975: 컨텍스트 키워드
var는 명시적 람다 반환 형식으로 사용할 수 없습니다. - CS9098: 암시적으로 형식화된 람다 매개 변수 '...' 은 기본값을 가질 수 없습니다.
또한 람다 식 선언 및 사용과 관련된 몇 가지 경고 가 있습니다.
- CS0467: 메서드 'method'와 메서드가 아닌 'non-method' 간의 모호성입니다. 메서드 그룹이 사용됩니다.
- CS1911: 익명 메서드, 람다 식, 쿼리 식 또는 반복기에서 'base' 키워드를 통해 멤버에 액세스하면 확인할 수 없는 코드가 생성됩니다.
- CS8971: 람다 매개 변수에 적용할 때 InterpolatedStringHandlerArgument가 적용되지 않으며 호출 사이트에서 무시됩니다.
- CS8974: 메서드 그룹 'method'를 대리자가 아닌 형식 'type'으로 변환합니다. 메서드를 호출하려고 했나요?
- CS9099: 기본 매개 변수 값이 대상 대리자 형식에서 일치하지 않습니다.
- CS9100: 매개 변수에는 람다에서 매개 변수 한정자가 있지만 대상 대리자 형식에는 없습니다.
컴파일러는 다음 정보 메시지도 생성합니다.
- CS9236: 컴파일하려면 람다 식을 최소 개수 이상으로 바인딩해야 합니다. 명시적 매개 변수 형식을 사용하여 람다 식을 선언하거나 포함하는 메서드 호출이 제네릭인 경우 명시적 형식 인수를 사용하는 것이 좋습니다.
람다 식의 구문 제한 사항
-
CS0837: 또는
is연산자의as첫 번째 피연산자는 람다 식, 무명 메서드 또는 메서드 그룹이 아닐 수 있습니다. -
CS1621: 익명 메서드 또는 람다 식 내에서 문을
yield사용할 수 없습니다. -
CS1628: 익명 메서드, 람다 식 또는 쿼리 식 내에서
in,ref,out매개 변수를 사용할 수 없습니다. - CS1632: 컨트롤은 무명 메서드 또는 람다 식의 본문을 그대로 둘 수 없습니다.
-
CS1673: 구조체 내의 익명 메서드, 람다 식 및 쿼리 식은 인스턴스 멤버에
this액세스할 수 없습니다. - CS1686: 지역 변수 또는 해당 멤버는 익명 메서드 또는 람다 식 내에서 주소를 가져와 사용할 수 없습니다.
- CS1706: 식은 익명 메서드 또는 람다 식을 포함할 수 없습니다.
- CS1764: 익명 메서드, 람다 식 또는 쿼리 식 내에서 고정된 로컬을 사용할 수 없습니다.
- CS1911: 경고: 익명 메서드, 람다 식, 쿼리 식 또는 반복기에서 'base' 키워드를 통해 멤버에 액세스하면 확인할 수 없는 코드가 생성됩니다.
- CS8175: 익명 메서드, 람다 식 또는 쿼리 식 내에서 ref 로컬을 사용할 수 없습니다.
- CS8820: 정적 익명 함수는 'variable'에 대한 참조를 포함할 수 없습니다.
- CS8821: 정적 익명 함수는 'this' 또는 'base'에 대한 참조를 포함할 수 없습니다.
- CS8971: 경고: 람다 매개 변수에 적용할 때 InterpolatedStringHandlerArgument가 적용되지 않으며 호출 사이트에서 무시됩니다.
- CS9236: 정보: 컴파일하려면 람다 식을 최소한 개수 이상으로 바인딩해야 합니다. 명시적 매개 변수 형식을 사용하여 람다 식을 선언하거나 포함하는 메서드 호출이 제네릭인 경우 명시적 형식 인수를 사용하는 것이 좋습니다.
컴파일러는 람다 식 및 익명 메서드 내에서 특정 C# 구문을 금지합니다. 컴파일러가 람다 및 익명 메서드를 대리 자 호출 또는 식 트리로 변환하고 일부 구문을 이러한 형식으로 나타낼 수 없으므로 이러한 제한이 존재합니다. 자세한 내용은 C# 사양의 익명 함수 식 섹션을 참조하세요.
다음 지침을 사용하여 이러한 오류를 수정할 수 있습니다.
- 임의의
yield return또는yield break문을 람다 본문에서 바깥쪽 반복기 메서드로 이동하거나,yield문을 지원하는 로컬 함수로 람다를 변환합니다(CS1621). - 람다 본문에서는 바깥쪽 메서드의 매개 변수
in,ref, 또는out를 참조하지 않도록 해야 합니다. 람다가 이러한 매개 변수를 클로저의 일부로 캡처하는 경우 유사 매개 변수의ref참조 의미 체계를 유지할 수 없습니다. 값을 지역 변수에 복사하고 대신 해당 로컬을 사용하거나 람다를 로컬 함수(CS1628)로 변환합니다. - 컨트롤을 람다 본문 밖으로 전송하는
break,goto, 또는continue문을 제거합니다. 제어 흐름 문은 동일한 람다 본문(CS1632) 내의 레이블 또는 루프를 대상으로 해야 합니다. -
struct형식에서 람다 식, 익명 메서드 또는 쿼리 식 내에서 인스턴스 멤버this를 참조하지 않습니다. 컴파일러가struct에서this을(를) 값으로 캡처하기 때문에, 람다 내부의 수정은 원래 인스턴스에 영향을 미치지 않습니다. 필요한 멤버 값을 람다 앞에 있는 지역 변수로 추출하거나 직접 액세스할this수 있는 로컬 함수(CS1673)로 변환합니다. - 람다도 캡처하는 지역 변수의 주소를 사용하지 마세요. 컴파일러는 캡처된 변수를 힙 할당 클로저 개체로 이동하여 주소를 불안정하게 만듭니다. 주소 지정 논리를 람다에서 분리하거나 로컬 함수를 대신 사용합니다(CS1686).
- 람다 식 또는 무명 메서드를 금지하는 포함 식에서 내보내십시오. 특성 생성자와 같은 일부 식은 인수로 람다 식 또는 무명 메서드를 지원하지 않습니다(CS1706).
- 람다 본문 내에서는 지역 변수를 사용하지
fixed마세요. 고정 보장fixed은 컴파일러가 생성하는 클로저(CS1764)가 아닌, 바깥쪽 범위에만 적용됩니다. - 람다 본문 내에 로컬을 사용하지
ref마세요. 매개 변수ref와 마찬가지로ref컴파일러가 람다에 대해 생성하는 닫기에서 로컬을 캡처할 수 없습니다. 지역 변수가 아닌ref변수에 값을 할당하거나 람다를 로컬 함수(CS8175)로 변환합니다. - 람다 식, 무명 메서드 또는 메서드 그룹을 or
is연산자의as첫 번째 피연산자로 사용하지 마세요. 이러한 구문에는 런타임에 테스트할 수 있는 형식이 없습니다. 먼저 변수에 식을 할당한 다음 변수(CS0837)를 테스트합니다. -
static람다에서 한정자를 제거하거나 캡처된 변수에 대한 참조를 제거합니다.static람다는 지역 변수, 매개 변수 캡처를 명시적으로 금지하거나this의도하지 않은 닫기 할당을 방지합니다. 외부 변수를 참조해야 하는 경우 한정자를static제거합니다. 힙 할당을 최소화하려면 값을 매개 변수로 람다(CS8820, CS8821)에 전달합니다. - InterpolatedStringHandlerArgumentAttribute 람다 매개 변수에서 제거하거나 특성을 적용할 메서드로 논리를 이동합니다. 람다 호출은 일반 메서드 호출(CS8971)과 동일한 보간된 문자열 처리기를 사용하지 않으므로 컴파일러는 람다 매개 변수에서 이 특성을 무시합니다.
- 람다 또는 무명 메서드 내에서
base키워드를 통해 가상 멤버를 호출하지 마십시오. 컴파일러는 확인되지 않는 코드를 생성하는 도우미 메서드를 통해 가상이 아닌 호출을 생성합니다. 호출을base별도의 메서드로 추출하고 대신 람다에서 해당 메서드를 호출하는 것이 좋습니다(CS1911). - 람다 식을 수락하거나 명시적 형식 정보를 추가하는 오버로드된 메서드 호출의 복잡성을 줄입니다. 컴파일러가 오버로드를 해결하기 위해 람다 식을 여러 번 바인딩해야 하는 경우 이 정보 진단을 내보낸다. 명시적 매개 변수 형식을 사용하여 람다를 선언하거나 제네릭 메서드 호출에 명시적 형식 인수를 제공하면 컴파일러가 수행해야 하는 바인딩 패스의 수가 줄어듭니다(CS9236).
람다 식 매개 변수 및 반환
- CS0748: 일치하지 않는 람다 매개 변수 사용량; 매개 변수 형식은 모두 명시적이거나 모든 암시적이어야 합니다.
- CS1065: 기본값은 이 컨텍스트에서 유효하지 않습니다.
- CS1643: 모든 코드 경로가 'type' 형식의 무명 메서드에서 값을 반환하는 것은 아닙니다.
- CS1661: 매개 변수 형식이 대리자 매개 변수 형식과 일치하지 않으므로 무명 메서드 블록을 'type' 형식으로 변환할 수 없습니다.
- CS1662: 블록의 일부 반환 형식은 대리자 반환 형식으로 암시적으로 변환할 수 없으므로 무명 메서드 블록을 의도한 대리자 형식으로 변환할 수 없습니다.
- CS1676: 'number' 매개 변수는 'keyword' 키워드를 사용하여 선언해야 합니다.
- CS1677: 'number' 매개 변수는 'keyword' 키워드로 선언하면 안 됩니다.
- CS1678: 매개 변수 'number'는 'type1' 형식으로 선언되지만 'type2'여야 합니다.
- CS1688: 하나 이상의 out 매개 변수가 있으므로 매개 변수 목록이 없는 무명 메서드 블록을 대리자 형식 'delegate'로 변환할 수 없습니다.
- CS1731: 블록의 일부 반환 형식은 대리자 반환 형식으로 암시적으로 변환할 수 없으므로 식을 대리자로 변환할 수 없습니다.
- CS1732: 예상 매개 변수입니다.
- CS8030: void 반환 대리자로 변환된 익명 함수는 값을 반환할 수 없습니다.
- CS8916: 람다 식의 특성에는 괄호가 있는 매개 변수 목록이 필요합니다.
- CS8934: 반환 형식이 대리자 반환 형식과 일치하지 않으므로 anonymous 메서드를 'type' 형식으로 변환할 수 없습니다.
- CS8975: 컨텍스트 키워드 'var'은 명시적 람다 반환 형식으로 사용할 수 없습니다.
- CS9098: 암시적으로 형식화된 람다 매개 변수 '...' 은 기본값을 가질 수 없습니다.
이러한 오류는 람다 식 매개 변수 또는 반환 형식 선언에 문제가 있음을 나타냅니다. 람다 매개 변수 및 반환 형식에 대한 전체 규칙은 C# 사양의 람다 식, 익명 메서드 및 익명 함수 식 섹션을 참조하세요.
메모
CS1731 및 CS1732 는 현재 버전의 C# 컴파일러(Roslyn)에서 더 이상 생성되지 않습니다. 이전 컴파일러 버전을 사용하는 경우 표시될 수 있습니다.
다음 지침을 사용하여 이러한 오류를 수정할 수 있습니다.
- 람다 식의 모든 매개 변수가 동일한 입력 스타일을 사용하는지 확인합니다. 람다에 여러 매개 변수가 있는 경우 각 매개 변수는 명시적으로 형식화 되거나 암시적으로 형식화되어야 합니다. 동일한 매개 변수 목록(CS0748)에서 두 스타일을 혼합할 수 없습니다.
- 기본값이 있는 모든 람다 매개 변수에 명시적 형식을 추가합니다. 컴파일러는 기본값을 인코딩하는 사용자 지정 대리자 형식을 생성해야 하므로 기본값이 있는 매개 변수에 명시적 형식이 필요합니다. 암시적으로 형식화된 매개 변수는 컴파일러가 해당 대리자 형식(CS1065, CS9098)을 생성하기에 충분한 정보를 제공하지 않습니다.
- 연산자를 사용하여 선언된 익명 메서드에서 기본 매개 변수 값을 제거합니다
delegate. 기본 매개 변수 값은 무명 메서드가 아닌 람다 식에서만 지원됩니다. 기본값(CS1065)이 필요한 경우 무명 메서드를 람다 식으로 변환합니다. - 람다 또는 무명 메서드의 매개 변수 형식,
ref/out/in한정자 및 매개 변수 수를 대상 대리자 형식과 일치합니다. 컴파일러는 익명 함수를 대리자로 변환할 때 매개변수 서명과 정확하게 일치시킵니다. 각 매개변수는 올바른 형식을 가져야 하며, 대리자가 기대하는 경우에 정확히ref,out,in한정자가 있어야 합니다. (CS1661, CS1676, CS1677, CS1678) - 대상 대리자 형식
out에 매개 변수가 있는 경우 익명 메서드에 매개 변수 목록을 추가합니다. 매개 변수 목록 없이 선언된 익명 메서드(구문 사용delegate { })는 대부분의 대리자 형식과 일치할 수 있지만 컴파일러는 필요한out매개 변수를 암시적으로 합성할 수 없습니다. 대리자 서명과 일치하도록 매개 변수를 명시적으로 선언합니다(CS1688). - 대상 대리자 형식에 void가 아닌 반환 형식이 있는 경우 람다 또는 무명 메서드의 모든 코드 경로가 값을 반환하는지 확인합니다. 본문의 각 분기는 자동 변환 가능한 반환 값을 대리자의 반환 형식(CS1643, CS1662, CS1731, CS8934)으로 생성해야 합니다.
- 람다 또는 무명 메서드로부터 값이 있는 문을
void와 같이Action와 같은 -returning 대리자 형식에 할당한 경우, 해당 문을 제거하십시오return. 대리자의 반환 형식이기 때문에 본문은void값(CS8030)을 반환할 수 없습니다. -
특성이 람다 매개 변수에 적용될 때 매개 변수 목록을 괄호로 묶습니다. 다른 식과 특성 구문을 구분하려면 컴파일러에 괄호가 있는 형식이 필요합니다. 예를 들어,
[MyAttribute] x => x대신([MyAttribute] int x) => x를 작성하십시오 (CS8916). - 람다 식의
var명시적 반환 형식 대신 특정 형식 이름을 사용합니다. 이 키워드var는 암시적으로 형식화된 지역 변수 용으로 예약되어 있으며 람다 반환 형식 주석으로 사용할 수 없습니다. 실제 반환 형식을 지정하거나 반환 형식을 생략하고 컴파일러에서 유추하도록 합니다(CS8975). - 컴파일러가 매개 변수 목록을 유효한 매개 변수 선언으로 인식할 수 있도록 매개 변수 목록을 수정합니다. 이 오류는 컴파일러가 매개 변수 식별자를 예상했지만 다른 것을 발견한 잘못된 형식의 매개 변수 목록을 나타냅니다(CS1732).
람다 식 대리자 형식
- CS0407: 'method'에 잘못된 반환 형식이 있습니다.
- CS0428: 메서드 그룹 'Identifier'를 대리자가 아닌 형식 'type'으로 변환할 수 없습니다. 메서드를 호출하려고 했나요?
- CS0467: 경고: 메서드 'method'와 메서드가 아닌 'non-method' 간의 모호성입니다. 메서드 그룹을 사용합니다.
- CS0815: 암시적으로 형식화된 변수에 'expression'을 할당할 수 없습니다.
- CS0828: 익명 형식 속성에 'expression'을 할당할 수 없습니다.
- CS1660: 대리자 형식이 아니므로 람다 식을 'type' 형식으로 변환할 수 없습니다.
- CS8917: 대리자 형식을 유추할 수 없습니다.
- CS8974: 경고: 메서드 그룹 'method'를 대리자가 아닌 형식 'type'으로 변환합니다. 메서드를 호출하려고 했나요?
- CS9099: 경고: 기본 매개 변수 값이 대상 대리자 형식에서 일치하지 않습니다.
- CS9100: 경고: 매개 변수에는 람다에서 매개 변수 한정자가 있지만 대상 대리자 형식에는 없습니다.
이러한 오류는 컴파일러가 람다 식, 익명 메서드 또는 메서드 그룹에 대해 유추하거나 예상하는 대리자 형식에 문제가 있음을 나타냅니다. 대리자 변환에 대한 전체 규칙은 C# 사양의 람다 식, 익명 메서드 및 익명 함수 식 섹션을 참조하세요.
메모
현재 버전의 C# 컴파일러(Roslyn)는 CS0467을 생성하지 않습니다. 이전 컴파일러 버전을 사용하는 경우 이 오류가 표시될 수 있습니다.
다음 지침을 사용하여 이러한 오류를 수정할 수 있습니다.
- 할당 또는 변환의 대상 형식이 대리자 형식 인지 확인합니다 System.Linq.Expressions.Expression. 람다 식 또는 무명 메서드는 대리자가 아닌 형식(예:
object인터페이스)에 할당할 수 없습니다. 변수의 형식을 호환되는 대리자 형식으로Func<>변경하거나Action<>컴파일러가 대리자 형식(var)을 유추하도록 하는 데 사용합니다. - 컴파일러가 람다 식에 대한 단일 대리자 형식을 결정하기에 충분한 컨텍스트를 제공합니다. 할당된
var경우 컴파일러에는 명확한 반환 형식 및 매개 변수 목록이 필요합니다. 익명 형식 속성에 할당된 경우 컴파일러는 대리자 형식을 전혀 유추할 수 없습니다. 명시적 대리자 형식의 변수에 람다를 할당한 다음 익명 형식 이니셜라이저(CS0815, CS0828, CS8917)에서 해당 변수를 사용합니다. - 메서드 그룹의 반환 형식을 대리자의 선언된 반환 형식과 일치합니다. 메서드 그룹 변환을 사용하려면 메서드의 반환 형식이 ID 변환 가능이거나 대리자의 반환 형식으로 암시적으로 변환할 수 있어야 합니다. 메서드의 반환 형식을 변경하거나 일치하는 대리자 형식을 변경합니다(CS0407).
- 대상 형식이 대리자가 아닌 경우 메서드 그룹을 할당하는 대신 메서드를 호출합니다. 대상 형식이
string,int또는 대리자 유형이 아닌 다른 형식인 경우, 메서드를 호출하고 그 결과를 할당하려고 했을 가능성이 큽니다. 메서드를 호출하는 괄호 및 인수를 추가합니다(CS0428, CS8974). - 동일한 이름을 공유하는 메서드와 메서드가 아닌 멤버 간의 모호성을 해결합니다. 충돌하는 멤버 중 하나의 이름을 바꾸거나 정규화된 참조를 사용하여 모호성을 제거합니다(CS0467).
- 대상 대리자 형식이 표준 또는
params형식인 경우 람다에서Func<>또는Action<>한정자를 제거합니다. 기본값 및params한정자는 컴파일러가Func<>또는Action<>와 일치하지 않는 사용자 지정 대리자 형식을 생성하도록 유도합니다.var컴파일러가 올바른 대리자 형식을 합성하도록 하거나 람다가 선언된 대리자 형식(params, CS9100)과 일치하도록 기본값 또는 한정자를 제거합니다.
.NET