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