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));
|