더북(TheBook)

11.3.1 튜플 리터럴의 타입

일부 튜플 리터럴은 타입을 가지지만 그렇지 않은 경우도 있다. 아주 간단한 규칙이 있는데, 튜플 내의 모든 표현식이 타입을 가지면 튜플도 타입을 가진다. 사실 C#에서 타입을 가지지 않는 표현식이라는 개념은 그리 새로운 것이 아니다. 람다 표현식, 메서드 그룹, null 리터럴은 타입이 없는 표현식이다. 마찬가지로 타입이 없는 튜플 리터럴은 지역 변수에 할당할 수 없다. 다음 예는 10과 20이 타입을 가진 표현식이므로 유효하다.

var valid = (10, 20);

하지만 다음 예는 null 리터럴이 타입이 없으므로 유효하지 않다.

var invalid = (10, null);

null 리터럴과 마찬가지로 타입이 없는 튜플 리터럴이라 하더라도 타입을 가지도록 변환할 수 있다. 튜플이 타입을 가지면 개별 요소들도 이름을 부여받는다.

다음 두 가지 예를 비교하며 살펴보자. 이 둘은 완전히 동일한 의미를 가진다.

var tuple = (x: 10, 20);

var array = new[] {("a", 10)};

string[] input = {"a", "b" };
var query = input
    .Select(x => (x, x.Length));
(int x, int) tuple = (x: 10, 20);

(string, int)[] array = {("a", 10)};

string[] input = {"a", "b" };
IEnumerable<(string, int)> query =
  input.Select<string, (string, int)>
  (x => (x, x.Length));
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.