C# 14 - (6) 람다 매개 변수에 접근자가 있는 경우에도 타입 생략 가능
이번에 다룰 내용은,
Simple lambda parameters with modifiers
; https://github.com/dotnet/csharplang/blob/main/proposals/simple-lambda-parameters-with-modifiers.md
Simple lambda parameters with modifiers
; https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-14#simple-lambda-parameters-with-modifiers
타입 추론으로 인한 생략 기능이 쪼끔 더 나아진 경우입니다. 사실, 이미 기존에도 타입명은 생략이 가능했었는데요, 가령 문자열을 숫자로 변환하는 람다를 다음과 같이 작성할 때,
Func<string, int> intParseFunc = (string text) =>
{
int.TryParse(text, out int result);
return result;
};
text 매개 변수의 타입을 생략할 수 있었습니다.
Func<string, int> intParseFunc = (text) =>
{
int.TryParse(text, out int result);
return result;
};
단지, 저게 불가능한 경우가 있었는데요, 바로 매개 변수에 scoped, ref, in, out, ref readonly 접근자가 붙는 경우입니다. 다음은 이에 대한 예시입니다.
internal class Program
{
delegate bool TryParseDelegate<T>(string text, out T result);
static void Main(string[] args)
{
// C# 13까지는 반드시 타입명을 지정
{
TryParseDelegate<int> intParseFunc = (string text, out int result) => Int32.TryParse(text, out result);
}
// C# 14부터 아래의 코드가 컴파일 가능
{
TryParseDelegate<int> intParseFunc = (text, out result) => Int32.TryParse(text, out result);
}
}
}
그런데 그동안 딱히 이게 없었어도 그다지 아쉬운 점은 많지 않았을 것입니다. 왜냐하면, 어차피 var 키워드를 사용하면 타입을 명시해야 했었기 때문입니다.
var intParseFunc = (string text, out int result) => Int32.TryParse(text, out result);
C# 14의 새로운 추론 기능이 유용한 경우를 굳이 찾는다면, 이전 예제처럼 델리게이트(TryParseDelegate) 타입을 명시하고 나서 그것에 람다를 할당하는 경우만으로 한정된다고 볼 수 있습니다.
참고로, 위에서 나열한 접근자(scoped, ref, in, out, ref readonly) 외에는 여전히 타입명을 지정해야 합니다. 가령, params 접근자의 경우일 텐데요,
delegate int GetLengthDelegate(params string[] text);
// params 접근자의 경우 타입명을 생략할 수 없으므로 컴파일 오류
// error CS9272: Implicitly typed lambda parameter 'text' cannot have the 'params' modifier.
GetLengthDelegate sumFunc = (params text) => text.Length;
C# 14에서도 여전히 오류가 발생합니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]