람다 식 선언 및 사용과 관련된 몇 가지 오류가 있습니다.
- CS0748: 일치하지 않는 람다 매개 변수 사용량; 매개 변수 형식은 모두 명시적이거나 모든 암시적이어야 합니다.
- CS1621: yield 문은 무명 메서드 또는 람다 식 내에서 사용할 수 없습니다.
-
CS1628: 익명 메서드, 람다 식 또는 쿼리 식 내에서 사용하거나
in매개 변수를 사용할refout수 없습니다. - CS1632: 컨트롤은 무명 메서드 또는 람다 식의 본문을 그대로 둘 수 없습니다.
- CS1673: 구조체 내의 익명 메서드, 람다 식 및 쿼리 식은 'this'의 인스턴스 멤버에 액세스할 수 없습니다.
- CS1686: 지역 변수 또는 해당 멤버는 익명 메서드 또는 람다 식 내에서 주소를 가져와 사용할 수 없습니다.
- CS1706: 식은 익명 메서드 또는 람다 식을 포함할 수 없습니다.
- CS8030: void 반환 대리자로 변환된 익명 함수는 값을 반환할 수 없습니다.
- CS8175: 익명 메서드, 람다 식 또는 쿼리 식 내에서 ref 로컬을 사용할 수 없습니다.
- CS8916: 람다 식의 특성에는 괄호가 있는 매개 변수 목록이 필요합니다.
- CS8971: 람다 매개 변수에 적용할 때 InterpolatedStringHandlerArgument가 적용되지 않으며 호출 사이트에서 무시됩니다.
-
CS8975: 컨텍스트 키워드
var는 명시적 람다 반환 형식으로 사용할 수 없습니다. - CS9098: 암시적으로 형식화된 람다 매개 변수 '...' 은 기본값을 가질 수 없습니다.
또한 람다 식 선언 및 사용과 관련된 몇 가지 경고 가 있습니다.
- CS8971: 람다 매개 변수에 적용할 때 InterpolatedStringHandlerArgument가 적용되지 않으며 호출 사이트에서 무시됩니다.
- CS9099: 기본 매개 변수 값이 대상 대리자 형식에서 일치하지 않습니다.
- CS9100: 매개 변수에는 람다에서 매개 변수 한정자가 있지만 대상 대리자 형식에는 없습니다.
컴파일러는 다음 정보 메시지도 생성합니다.
- CS9236: 컴파일하려면 람다 식을 최소 개수 이상으로 바인딩해야 합니다. 명시적 매개 변수 형식을 사용하여 람다 식을 선언하거나 포함하는 메서드 호출이 제네릭인 경우 명시적 형식 인수를 사용하는 것이 좋습니다.
람다 식의 구문 제한 사항
일부 C# 구문은 람다 식 및 무명 메서드에서 금지됩니다. 람다 식에 잘못된 구문을 사용하면 다음과 같은 오류가 발생합니다.
-
CS1621: 익명 메서드 또는 람다 식 내에서 문을
yield사용할 수 없습니다. -
CS1628: 익명 메서드, 람다 식 또는 쿼리 식 내에서
in,ref,out매개 변수를 사용할 수 없습니다. - CS1632: 컨트롤은 무명 메서드 또는 람다 식의 본문을 그대로 둘 수 없습니다.
-
CS1673: 구조체 내의 익명 메서드, 람다 식 및 쿼리 식은 인스턴스 멤버에
this액세스할 수 없습니다. - CS1686: 지역 변수 또는 해당 멤버는 익명 메서드 또는 람다 식 내에서 주소를 가져와 사용할 수 없습니다.
- CS8175: 익명 메서드, 람다 식 또는 쿼리 식 내에서 ref 로컬을 사용할 수 없습니다.
다음 구문은 모두 람다 식에서 허용되지 않습니다.
-
yield문장 (yield return또는yield break) -
in또는ref또는out매개 변수가 있는 메서드 호출하기 -
ref지역 변수 -
break,goto,continue문 -
struct유형인 경우this에 대한this접근 - 특성 생성자와 같은 다른 식 내의 익명 메서드 또는 람다 식입니다.
람다 식이나 익명 메서드에서는 이러한 구문을 사용할 수 없습니다. 대부분은 로컬 함수에서 허용됩니다.
또한 보간 문자열 처리기 유형은 람다 매개 변수에 적용될 때 무시됩니다. 하나를 사용하는 경우 다음과 같은 경고가 표시됩니다.
- CS8971: 람다 매개 변수에 적용할 때 InterpolatedStringHandlerArgument가 적용되지 않으며 호출 사이트에서 무시됩니다.
특정 식으로 인해 컴파일러에서 다음 정보 경고를 내보낸다.
- CS9236: 컴파일하려면 람다 식을 최소 개수 이상으로 바인딩해야 합니다. 명시적 매개 변수 형식을 사용하여 람다 식을 선언하거나 포함하는 메서드 호출이 제네릭인 경우 명시적 형식 인수를 사용하는 것이 좋습니다.
람다 식의 복잡성과 다른 람다 식을 호출하는 방법은 컴파일러 성능에 부정적인 영향을 줍니다. 그 이유는 컴파일러가 람다 식을 통해 매개 변수 및 인수 형식을 유추해야 하며 잠재적 형식에는 시간이 걸리기 때문입니다.
람다 식 매개 변수 및 반환
이러한 오류는 매개 변수 선언에 문제가 있음을 나타냅니다.
- CS0748: 일치하지 않는 람다 매개 변수 사용량; 매개 변수 형식은 모두 명시적이거나 모든 암시적이어야 합니다.
- CS9098: 암시적으로 형식화된 람다 매개 변수 '...' 은 기본값을 가질 수 없습니다.
- CS8030: void 반환 대리자로 변환된 익명 함수는 값을 반환할 수 없습니다.
- CS8916: 람다 식의 특성에는 괄호가 있는 매개 변수 목록이 필요합니다.
- CS8975: 컨텍스트 키워드 'var'은 명시적 람다 반환 형식으로 사용할 수 없습니다.
람다 식 매개 변수는 다음 규칙을 따라야 합니다.
- 람다 식에 여러 매개 변수가 있는 경우 모든 매개 변수를 명시적으로 입력하거나 모든 매개 변수를 암시적으로 입력해야 합니다.
- 기본값이 있는 모든 람다 매개 변수는 명시적으로 입력해야 합니다.
- 특성이 매개 변수에 적용되는 경우 매개 변수 목록을 괄호로 묶어야 합니다.
람다 식의 반환 형식은 다음 규칙을 따라야 합니다.
- 값을 반환하는 람다 식은
void를 반환하는 대리자, 예를 들면Action로 변환할 수 없습니다. - 반환 형식이 유추되거나 명시적 형식입니다. 키워드
var를 사용하여 선언된 반환 형식은 허용되지 않습니다.
람다 식 대리자 형식
- CS9099: 경고: 기본 매개 변수 값이 대상 대리자 형식에서 일치하지 않습니다.
람다 표현식 매개 변수와 함께 기본값을 선언하거나 params 한정자를 추가할 때, 대리자 형식은 Func 또는 Action 형식이 아닙니다. 대신 기본 매개 변수 값 또는 params 한정자를 포함하는 사용자 지정 형식입니다. 다음 코드는 기본 매개 변수가 있는 람다 식을 Action 유형에 할당하기 때문에 경고를 생성합니다.
Action<int> a1 = (int i = 2) => { };
Action<string[]> a3 = (params string[] s) => { };
오류를 해결하려면 기본 매개 변수를 제거하거나 대리자 형식에 암시적으로 형식화된 변수를 사용합니다.
Action<int> a1 = (int i) => { };
var a2 = (int i = 2) => { };
Action<string[]> a3 = (string[] s) => { };
var a4 = (params string[] s) => { };
.NET