VisualStudio/C#

[C#] Func 람다식 Expression오류(cs0834)

usingsystem 2024. 9. 11. 13:35
728x90

우선 Func 람다 형식은 표현식(Expression)람다와 문(Statement)람다 2가지가 존재한다.

 

표현식(Expression) 람다: 하나의 표현식으로만 구성된 람다입니다. 이 경우 return 키워드를 사용하지 않고, 람다의 결과는 그 표현식 자체가 됩니다.

Func<int, int> square = x => x * x; // 표현식 람다

문(Statement) 람다: 중괄호 {}를 사용하여 여러 문으로 구성된 람다입니다. 이 경우 return 키워드를 사용할 수 있습니다.

Func<int, int> square = x =>
{
    int result = x * x;
    return result; // 문 람다에서는 return 사용 가능
};
 

C#에서 CS0834 오류는 "A lambda expression with a statement body cannot be converted to an expression tree"라는 에러 메시지를 나타내며, 이는 문 람다(statement lambda)가 표현식 트리(Expression Tree)로 변환될 수 없기 때문에 발생합니다.

 

즉 표현식 트리로의 변환 요구를 명시적으로 작성해서 일어나는 문제로 표현식 트리는 코드를 표현식 형태로 저장하는 데이터 구조로, 단일 표현식만을 포함할 수 있고, 문 람다(중괄호를 사용하여 여러 문을 포함하는 람다)는 포함할 수 없습니다.

// Expression<Func<int, int>>를 매개변수로 받는 함수
void UseExpressionTree(Expression<Func<int, int>> expr)
{
    // 표현식 트리를 처리하는 코드
}

// 표현식 람다는 정상적으로 작동합니다.
UseExpressionTree(x => x * x); // OK

// 문 람다는 오류를 발생시킵니다.
UseExpressionTree(x =>
{
    int result = x * x;
    return result; // CS0834 오류 발생
});

 

 

 

https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-messages/expression-tree-restrictions?f1url=%3FappId%3Droslyn%26k%3Dk(CS0834)

 

Some expressions are prohibited in expression trees. Learn which expressions aren't allowed - C# reference

These compiler errors and warnings indicate that an expression would include an expression that isn't allowed in an expression tree. You need to refactor your code to remove the prohibited expression.

learn.microsoft.com

 

728x90