[C#] C# 버전 10에서 Lambda expression 개선 사항

 .NET 6 부터 C# language version 10을 지원합니다. 여러 개선 사항중에 Lambda expression에 몇가지가 개선이 되었는데요, 한 번 알아보겠습니다.

 

원문 링크: https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/lambda-expressions#explicit-return-type

 

1. Natural type of a lambda expression

 아래와 같이 가변형 변수에 람다식을 할당하면 이전 버전에서는 에러를 뿜어내서 var 대신 Func<string, int>로 타입을 명시적으로 선언해줘야 하는 불편함이 있었는데 컴파일러가 이제 조금 똑똑해져서 람다 표현식으로 부터 추론해서 리턴하는 값이 타입을 알아서 결정해줍니다.

var parse = (string s) => int.Parse(s);

이런건 진즉에 가능했어야 하는 표현식인데 말이죠.... 마소 열일 안하는듯..

 

2. Lambda expression에  return type을 지정 할 수 있게 되었습니다.

 

아래와 같은 람다 표현식에서 b의 값에 따라 int 값을 리턴하거나 string 값을 리턴하는 표현식이어서 컴파일러 입장에서는 choose라는 변수의 타입 결정이 모호해져서 에러를 뿜어냅니다. 실제로 이렇게 여러가지 type을 return해야 하는 경우들이 많이 발생하는데 명시적으로 형변환을 해서 return 타입을 일치시키는 것도 좀 귀찮죠.

var choose = (bool b) => b ? 1 : "two"; // ERROR: Can't infer return type

그래서 C# 10부터는 람다식 앞쪽에 return 타입을 명시적으로 지정해 줄 수 있습니다.

var choose = object (bool b) => b ? 1 : "two"; // Func<bool, object>

개인적으로는 저렇게 여러 타입이 리턴되는 경우에 그냥 컴파일러가 implicit하게 object 타입으로 해석해줬으면 귀찮게 앞에 또 object라고 써 줄 필요가 없을텐데 말이죠. 다른 언어들을 사용하다보면 C#이 좀 답답하다 느껴질때가 자주 있는데 얼른얼른 많은 개선이 이루어지길 바랍니다.

 

3. Attributes

 

 람다식에 혹은 각각의 파라미터에 attribute를 지정할 수 있게 되었습니다. 개인적으로 람다식에 궂이 attribute를 지정해줘야할 필요성을 느껴본적이 없어서 뭐가 좋은지 아직은 잘 모르겠지만 뭐든 flexible해지면 좋은건 맞으니까...

 아래와 같이 람다식에 attribute를 지정하거나

Func<string?, int?> parse = [ProvidesNullCheck] (s) => (s is not null) ? int.Parse(s) : null;

 파라미터 각각에 attribute를 지정하거나 아래와 같이 return 값에도 가능합니다. 

var concat = ([DisallowNull] string a, [DisallowNull] string b) => a + b;
var inc = [return: NotNullifNotNull(nameof(s))] (int? s) => s.HasValue ? s++ : null;