다음을 통해 공유


람다 식 및 무명 함수를 사용할 때 발생하는 오류 및 경고

람다 식 선언 및 사용과 관련된 몇 가지 오류가 있습니다.

  • CS0748: 람다 매개 변수가 일관성 없이 사용되었습니다. 매개 변수 형식은 모두 명시적이거나 모두 암시적이어야 합니다.
  • CS1621: yield 문은 무명 메서드 또는 람다 식 안에 사용할 수 없습니다.
  • CS1628: 무명 메서드, 람다 식 또는 쿼리 식 안에는 inref 또는 out 매개 변수를 사용할 수 없습니다.
  • CS1632: 제어가 무명 메서드 또는 람다 식의 본문을 벗어날 수 없습니다.
  • CS1673: 구조체 안의 무명 메서드, 람다 식, 쿼리 식은 'this'의 인스턴스 멤버에 액세스할 수 없습니다.
  • CS1686: 지역 변수 또는 해당 멤버의 주소를 가져와 무명 메서드 또는 람다 식 안에 사용할 수 없습니다.
  • CS1706: 식에 무명 메서드 또는 람다 식을 포함할 수 없습니다.
  • CS8030: void 반환 대리자로 변환된 무명 함수는 값을 반환할 수 없습니다.
  • CS8175: 무명 메서드, 람다 식 또는 쿼리 식에 ref 로컬을 사용할 수 없습니다.
  • CS8916: 람다 식의 특성에는 괄호로 묶인 매개 변수 목록이 필요합니다.
  • CS8971: InterpolatedStringHandlerArgument는 람다 매개 변수에 적용할 때 효과가 없으며 호출 사이트에서 무시됩니다.
  • CS8975: 상황별 키워드 var은 명시적 람다 반환 형식으로 사용할 수 없습니다.
  • CS9098: 암시적 형식 람다 매개 변수 '...'은 기본값을 가질 수 없습니다.

또한 람다 식 선언 및 사용과 관련된 몇 가지 경고가 있습니다.

  • CS8971: InterpolatedStringHandlerArgument는 람다 매개 변수에 적용할 때 효과가 없으며 호출 사이트에서 무시됩니다.
  • CS9099: 기본 매개 변수 값이 대상 대리자 형식에서 일치하지 않습니다.
  • CS9100: 매개 변수에 람다 params 한정자는 있지만 대상 대리자 형식으로는 없습니다.

람다 식의 구문 제한 사항

일부 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
  • thisstruct 형식인 경우 this 액세스
  • 특성 생성자와 같은 다른 식 내의 무명 메서드 또는 람다 식.

람다 식이나 무명 메서드에는 이러한 구문을 사용할 수 없습니다. 대부분은 로컬 함수에서 허용됩니다.

또한 보간된 문자열 처리기 형식은 람다 매개 변수에 적용될 때 무시됩니다. 사용하는 경우 다음과 같은 경고가 표시됩니다.

  • CS8971: InterpolatedStringHandlerArgument는 람다 매개 변수에 적용할 때 효과가 없으며 호출 사이트에서 무시됩니다.

람다 식 매개 변수 및 반환

다음 오류는 매개 변수 선언에 문제가 있음을 나타냅니다.

  • CS0748: 람다 매개 변수가 일관성 없이 사용되었습니다. 매개 변수 형식은 모두 명시적이거나 모두 암시적이어야 합니다.
  • CS9098: 암시적 형식 람다 매개 변수 '...'은 기본값을 가질 수 없습니다.
  • CS8030: void 반환 대리자로 변환된 무명 함수는 값을 반환할 수 없습니다.
  • CS8916: 람다 식의 특성에는 괄호로 묶인 매개 변수 목록이 필요합니다.
  • CS8975: 상황별 키워드 'var'은 명시적 람다 반환 형식으로 사용할 수 없습니다.

람다 식 매개 변수는 다음 규칙을 따라야 합니다.

  • 람다 식에 여러 매개 변수가 있는 경우 모든 매개 변수를 명시적으로 형식화하거나 모든 매개 변수를 암시적으로 형식화해야 합니다.
  • 기본값이 있는 모든 람다 매개 변수는 명시적으로 형식화해야 합니다.
  • 특성이 매개 변수에 적용되는 경우 매개 변수 목록을 괄호로 묶어야 합니다.

람다 식의 반환 형식은 다음 규칙을 따라야 합니다.

  • 값을 반환하는 람다 식은 Action과 같은 void 반환 대리자로 변환할 수 없습니다.
  • 반환 형식은 유추되거나 명시적 형식입니다. 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) => { };