C# 12 - 정적 문맥에서 인스턴스 멤버에 대한 nameof 접근 허용(Allow nameof to always access instance members from static context)
(이번부터는 공식 문서에 아직 번역이 없어 제 마음대로 제목을 지었습니다. ^^; 실습은 현재 최신 버전의 Visual Studio 2022에서 LangVersion만 "preview"로 설정하면 됩니다.)
(2023-11-15: 현재 이 기능은 공식적으로는 C# 12의 "What's new in C# 12" 문서에는 나열되지 않습니다. 단지, 기능 구현은 되어 있는 것이 맞습니다.)
제목 그대로,
Allow nameof to always access instance members from static context
; https://github.com/dotnet/csharplang/issues/4037
Language Feature Status
; https://github.com/dotnet/roslyn/blob/main/docs/Language%20Feature%20Status.md#c-120
예를 들어 아래의 "2)"번 사례처럼, 기존에는 정적 메서드의 문맥에서 인스턴스 멤버의 속성을 접근하면,
namespace ConsoleApp1;
internal class Program
{
public string Path = "";
public static string GetPathName() => nameof(Path); // 1) 컴파일 OK
public static string GetLengthName() => nameof(Path.Length); // 2) C# 11 이하에서 컴파일 오류
// public string GetLengthName() => nameof(Path.Length); // 3) 컴파일 OK
public static string GetLengthName2() => nameof(Program.Path.Length); // 4) 컴파일 OK
static void Main(string[] args)
{
Console.WriteLine(Program.GetLengthName());
}
}
컴파일 오류가 발생합니다. 바로 이런 경우 C# 12부터는 풀이가 되도록 허용하는 정도의 개선이 포함되었습니다. (사실 4번 유형과 같이 우회하는 방법이 있기 때문에 딱히 중요한 개선은 아닙니다.)
재미있는 것은, C# 스펙 문서에서 "static context"라는 단서를 달긴 했지만,
특성 내에서 사용하는 경우에도 이와 유사한 문제가 있었는데요,
public class People
{
[Author(nameof(P1))] // 컴파일 OK
public string P1 = "";
[Author(nameof(P2.Length))] // 컴파일 오류
public string P2 = "";
[Author(nameof(System.String.Length))] // 컴파일 OK
public string P3 = "";
[Author(nameof(Author.Name.Length))] // 컴파일 OK
public string P4 = "";
}
public class Author : System.Attribute
{
public readonly string Name;
public Author(string name) => Name = name;}
}
위의 사용 역시 이번 개선으로 해결돼 컴파일이 잘됩니다. 저런 의미에서 봤을 때, 아마도 (특성 자체가 인스턴스 멤버에 부여되었어도) nameof 입장에서 특성에 적용된 문맥은 static에 속함을 짐작게 합니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]