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

C# 7.0에서도 부분적으로 가능해진 "타입 추론을 통한 튜플의 변수명 자동 지정"

C# 7.1 컴파일러부터 "타입 추론을 통한 튜플의 변수명 자동 지정"이 추가되었습니다.

Infer tuple names (aka. tuple projection initializers)
; https://github.com/dotnet/csharplang/blob/master/proposals/csharp-7.1/infer-tuple-names.md

제 책에서는 "13.3" 절에 그 내용을 설명하고 있는데요. 관련해서 책에 포함된 예제가 다음의 코드입니다.

int age = 20;
string name = "Kevin Arnold";

var person = (age, name);

Console.WriteLine($"{person.age}, {person.name}");

위의 코드를 C# 7.0 컴파일러에 맞춰놓고 빌드하면 다음과 같은 CS8306 컴파일 오류가 발생합니다.

1>------ Build started: Project: ConsoleApp2, Configuration: Debug Any CPU ------
1>D:\temp\ConsoleApp2\ConsoleApp2\Program.cs(18,41,18,44): error CS8306: Tuple element name 'age' is inferred. Please use language version 7.1 or greater to access an element by its inferred name.
1>D:\temp\ConsoleApp2\ConsoleApp2\Program.cs(18,55,18,59): error CS8306: Tuple element name 'name' is inferred. Please use language version 7.1 or greater to access an element by its inferred name.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

오류 메시지에 보이듯이, 당연히 C# 7.1로 설정하고 빌드하면 정상적으로 컴파일이 됩니다.




그런데 우연히 보게 된 글에서,

Something Wrong In Csharp Tuple
C#의 튜플은 어디서부턴가 잘못되었다
; https://phillyai.github.io/2017-08-22-Something-Wrong-In-Csharp-Tuple/

재미있는 예제를 접했습니다.

using System;
using System.Linq;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] list = { 3, 1, 4, 1, 5, 9, 2 };
            foreach (var (v, i) in list.Select((val, index) => (val, index)))
            {
                Console.WriteLine($"{i}: {v}");
            }
        }
    }
}

위의 예제 코드를 최근의 Visual Studio에서 C# 7.0을 대상으로 빌드하면 정상적으로 빌드가 됩니다. 그런데, 좀 오래된 Visual Studio, 확실하게 15.3.1 버전의 경우에는 C# 7.0을 대상으로 하면 다음과 같은 CS8306 컴파일 오류가 발생합니다.

1>------ Rebuild All started: Project: ConsoleApp2, Configuration: Debug Any CPU ------
1>D:\temp\ConsoleApp2\ConsoleApp2\Program.cs(14,13,17,14): error CS8306: Tuple element name 'val' is inferred. Please use language version 7.1 or greater to access an element by its inferred name.
1>D:\temp\ConsoleApp2\ConsoleApp2\Program.cs(14,13,17,14): error CS8306: Tuple element name 'index' is inferred. Please use language version 7.1 or greater to access an element by its inferred name.
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

동일하게 "CS8306: Tuple element name '...' is inferred" 컴파일 오류인데, 최근의 C# 컴파일러에서는 7.0으로 맞춰놓고 해도 정상적으로 빌드가 되는 것입니다. 제 예상으로는, roslyn 컴파일러의 소스 코드를 7.1 이후에 수정을 하다가 C# 7.0 모드에서도 튜플에 대한 변수명이 추론이 되도록 하는 (좋은) 부작용이 발생한 것으로 보입니다.




일반적인 상황에서는 전혀 중요하지 않은 이야기인데... 혹시나 관련 소스 코드를 빌드하면서 C# 7.0에도 튜플 추론이 잘 된다고 메일을 보내실 독자분을 위해 미리 쉴드성 글을 남깁니다. ^^




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







[최초 등록일: ]
[최종 수정일: 5/11/2018]

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

비밀번호

댓글 작성자
 




... 151  152  153  154  155  156  157  [158]  159  160  161  162  163  164  165  ...
NoWriterDateCnt.TitleFile(s)
1099정성태8/15/201128285오류 유형: 132. 어느 순간 갑자기 접속이 안 되는 TFS 서버
1098정성태8/15/201150347웹: 24. 네이버는 어떻게 로그인 처리를 할까요? [2]
1097정성태8/15/201121643.NET Framework: 235. 메서드의 메타 데이터 토큰 값으로 클래스를 찾아내는 방법
1096정성태8/15/201125782디버깅 기술: 42. Watson Bucket 정보를 이용한 CLR 응용 프로그램 예외 분석 - (2)
1095정성태8/14/201126171디버깅 기술: 41. Windbg - 비정상 종료된 닷넷 프로그램의 StackTrace에서 보이는 offset 값 의미
1094정성태8/14/201130609오류 유형: 131. Fiddler가 강제 종료된 경우, 웹 사이트 방문이 안되는 현상
1093정성태7/27/201124196오류 유형: 130. Unable to connect to the Microsoft Visual Studio Remote Debugging Monitor ... Access is denied.
1092정성태7/22/201126633Team Foundation Server: 46. 코드 이외의 파일에 대해 소스 제어에서 제외시키는 방법
1091정성태7/21/201125664개발 환경 구성: 128. WP7 Emulator 실행 시 audiodg.exe의 CPU 소모율 증가 [2]
1089정성태7/18/201131243.NET Framework: 234. 왜? Button 컨트롤에는 MouseDown/MouseUp 이벤트가 발생하지 않을까요?파일 다운로드1
1088정성태7/16/201124264.NET Framework: 233. Entity Framework 4.1 - 윈도우 폰 7에서의 CodeFirst 순환 참조 문제파일 다운로드1
1087정성태7/15/201127009.NET Framework: 232. Entity Framework 4.1 - CodeFirst 개체의 직렬화 시 순환 참조 해결하는 방법 - 두 번째 이야기파일 다운로드1
1086정성태7/14/201128396.NET Framework: 231. Entity Framework 4.1 - CodeFirst 개체의 직렬화 시 순환 참조 해결하는 방법 [1]파일 다운로드1
1085정성태7/14/201128891.NET Framework: 230. Entity Framework 4.1 - Code First + WCF 서비스 시 EndpointNotFoundException 오류 - 두 번째 이야기파일 다운로드1
1084정성태7/11/201134164.NET Framework: 229. SQL 서버 - DB 테이블의 데이터 변경에 대한 알림 처리 [4]파일 다운로드1
1083정성태7/11/201128211.NET Framework: 228. Entity Framework 4.1 - Code First + WCF 서비스 시 EndpointNotFoundException 오류
1082정성태7/10/201127760.NET Framework: 227. basicHttpBinding + 사용자 정의 인증 구현 [2]파일 다운로드1
1081정성태7/9/201127090VC++: 53. Windows 7에서 gcc.exe 실행 시 Access denied 오류 [2]
1080정성태7/8/201125595웹: 23. Sysnet 웹 사이트의 HTML5 변환 기록 - 두 번째 이야기파일 다운로드1
1079정성태7/6/201130015오류 유형: 129. Hyper-V + Realtek 랜카드가 설치된 시스템의 BSOD 현상 [2]
1078정성태7/5/201137492VC++: 52. Chromium 컴파일하는 방법 [2]
1077정성태6/24/201135121.NET Framework: 226. HttpWebRequest 타입의 HaveResponse 속성 이야기파일 다운로드1
1076정성태6/23/201129317오류 유형: 128. SQL Express - User Instance 옵션을 사용한 경우 발생하는 오류 메시지 유형 2가지
1075정성태6/21/201124880VS.NET IDE: 69. 윈폰 프로젝트에서 WCF 서비스 참조할 때 Reference.cs 파일이 비어있는 경우
1074정성태6/20/201125003.NET Framework: 225. 닷넷 네트워크 라이브러리의 트레이스 기능파일 다운로드1
1073정성태6/20/201127233오류 유형: 127. Visual Studio에서 WCF 서비스의 이름 변경 시 발생할 수 있는 오류
... 151  152  153  154  155  156  157  [158]  159  160  161  162  163  164  165  ...