Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

(시리즈 글이 9개 있습니다.)
닷넷: 2112. C# 12 - 기본 람다 매개 변수
; https://www.sysnet.pe.kr/2/0/13338

닷넷: 2113. C# 12 - 기본 생성자(Primary Constructors)
; https://www.sysnet.pe.kr/2/0/13339

닷넷: 2114. C# 12 - 모든 형식의 별칭(Using aliases for any type)
; https://www.sysnet.pe.kr/2/0/13341

닷넷: 2141. C# 12 - Interceptor (컴파일 시에 메서드 호출 재작성)
; https://www.sysnet.pe.kr/2/0/13410

닷넷: 2142. C# 12 - 인라인 배열(Inline Arrays)
; https://www.sysnet.pe.kr/2/0/13412

닷넷: 2144. C# 12 - 컬렉션 식(Collection Expressions)
; https://www.sysnet.pe.kr/2/0/13415

닷넷: 2150. C# 12 - 정적 문맥에서 인스턴스 멤버에 대한 nameof 접근 허용(Allow nameof to always access instance members from static context)
; https://www.sysnet.pe.kr/2/0/13427

닷넷: 2151. C# 12 - ref readonly 매개변수
; https://www.sysnet.pe.kr/2/0/13428

닷넷: 2160. C# 12 - Experimental 특성 지원
; https://www.sysnet.pe.kr/2/0/13444




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에 속함을 짐작게 합니다.





[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 11/15/2023]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 121  122  123  124  125  126  127  128  129  130  131  [132]  133  134  135  ...
NoWriterDateCnt.TitleFile(s)
1788정성태10/22/201424259VC++: 82. COM 프로그래밍에서 HRESULT 타입의 S_FALSE는 실패일까요? 성공일까요? [2]
1787정성태10/22/201432538오류 유형: 252. COM 개체 등록시 0x8002801C 오류가 발생한다면?
1786정성태10/22/201434033디버깅 기술: 65. 프로세스 비정상 종료 시 "Debug Diagnostic Tool"를 이용해 덤프를 남기는 방법 [3]파일 다운로드1
1785정성태10/22/201423131오류 유형: 251. 이벤트 로그 - Load control template file /_controltemplates/TaxonomyPicker.ascx failed [1]
1784정성태10/22/201430710.NET Framework: 472. C/C++과 C# 사이의 메모리 할당/해제 방법파일 다운로드1
1783정성태10/21/201424498VC++: 81. 프로그래밍에서 borrowing의 개념
1782정성태10/21/201421261오류 유형: 250. 이벤트 로그 - Application Server job failed for service instance Microsoft.Office.Server.Search.Administration.SearchServiceInstance
1781정성태10/21/201421989디버깅 기술: 64. new/delete의 짝이 맞는 경우에도 메모리 누수가 발생한다면?
1780정성태10/15/201425820오류 유형: 249. The application-specific permission settings do not grant Local Activation permission for the COM Server application with CLSID
1779정성태10/15/201421057오류 유형: 248. Active Directory에서 OU가 지워지지 않는 경우
1778정성태10/10/201419487오류 유형: 247. The Netlogon service could not create server share C:\Windows\SYSVOL\sysvol\[도메인명]\SCRIPTS.
1777정성태10/10/201422509오류 유형: 246. The processing of Group Policy failed. Windows attempted to read the file \\[도메인]\sysvol\[도메인]\Policies\{...GUID...}\gpt.ini
1776정성태10/10/201419595오류 유형: 245. 이벤트 로그 - Name resolution for the name _ldap._tcp.dc._msdcs.[도메인명]. timed out after none of the configured DNS servers responded.
1775정성태10/9/201420819오류 유형: 244. Visual Studio 디버깅 (2) - Unable to break execution. This process is not currently executing the type of code that you selected to debug.
1774정성태10/9/201427734개발 환경 구성: 246. IIS 작업자 프로세스의 20분 자동 재생(Recycle)을 끄는 방법
1773정성태10/8/201430988.NET Framework: 471. 웹 브라우저로 다운로드가 되는 파일을 왜 C# 코드로 하면 안되는 걸까요? [1]
1772정성태10/3/201419788.NET Framework: 470. C# 3.0의 기본 인자(default parameter)가 .NET 1.1/2.0에서도 실행될까? [3]
1771정성태10/2/201428934개발 환경 구성: 245. 실행된 프로세스(EXE)의 명령행 인자를 확인하고 싶다면 - Sysmon [4]
1770정성태10/2/201422800개발 환경 구성: 244. 매크로 정의를 이용해 파일 하나로 C++과 C#에서 공유하는 방법 [1]파일 다운로드1
1769정성태10/1/201425539개발 환경 구성: 243. Scala 개발 환경 구성(JVM, 닷넷) [1]
1768정성태10/1/201420331개발 환경 구성: 242. 배치 파일에서 Thread.Sleep 효과를 주는 방법 [5]
1767정성태10/1/201425695VS.NET IDE: 94. Visual Studio 2012/2013에서의 매크로 구현 - Visual Commander [2]
1766정성태10/1/201423831개발 환경 구성: 241. 책 "프로그래밍 클로저: Lisp"을 읽고 나서. [1]
1765정성태9/30/201427478.NET Framework: 469. Unity3d에서 transform을 변수에 할당해 사용하는 특별한 이유가 있을까요?
1764정성태9/30/201423715오류 유형: 243. 파일 삭제가 안 되는 경우 - The action can't be comleted because the file is open in System
1763정성태9/30/201425242.NET Framework: 468. PDB 파일을 연동해 소스 코드 라인 정보를 알아내는 방법파일 다운로드1
... 121  122  123  124  125  126  127  128  129  130  131  [132]  133  134  135  ...