Section 37.4: LINQ 타입 변환 (Casting) 연산들
아래와 같은 타입을 가지고 있다고 가정해 보자:
interface IThing { }
class Thing : IThing { }
LINQ 는 Enumerable.Cast<>()
와 Enumerable.OfType<>()
확장 메소드를 통해, IEnumerable<>
의 컴파일 타임의 제네릭 타입을 다른 타입으로 변환시킨 프로젝션을 생성할 수 있도록 지원하고 있다.
IEnumerable<IThing> things = new IThing[] {new Thing()};
IEnumerable<Thing> things2 = things.Cast<Thing>();
IEnumerable<Thing> things3 = things.OfType<Thing>();
things2
에 값이 할당 (evaluate) 될 때는, Cast<>()
메소드가 things
안에 들어있는 모든 값들에 대해 Thing
타입으로의 변환을 시도할 것이다. 만약, 하나라도 변환이 불가능한 경우가 있다면 InvalidCastException
예외가 발생될 것이다.
things3
에 값이 할당 (evaluate) 될 때는, OfType<>()
메소드가 동일한 작업을 수행할 것이나, 타입 변환 불가시에는 예외를 발생시키는 대신 해당 값을 생략하고 진행하게 될 것이다.
이 메소드들의 제네릭 타입으로 인해, 변환 연산자 (conversion operator) 사용이나 숫자 변환을 사용할 수 없다.
역주: 이 부분에 대한 정확한 이해가 어려워, 비슷한 사례를 Stack Overflow 에서 찾아보았습니다. 좀 더 상세한 설명이 필요하신 분들은 아래 링크 참조하시면 될 것 같습니다. https://stackoverflow.com/questions/41168927/how-to-use-ienumerable-cast-and-toarray-to-convert-int-array-to-an-enum-arr
double[] doubles = new[]{1,2,3}.Cast<double>().ToArray(); // InvalidCastException 이 발생된다
이러한 경우 .Select()
안에서 변환을 수행하는 방법을 사용할 수 있다:
double[] doubles = new[]{1,2,3}.Select(i => (double)i).ToArray();
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.
[출처] https://books.goalkicker.com/CSharpBook/
'번역 > C# Notes for Professionals' 카테고리의 다른 글
37.6: 안전한 명시적 타입 변환 (as 연산자를 이용한) (0) | 2022.01.12 |
---|---|
37.5: 명시적 타입 변환 (Explicit Casting) (0) | 2022.01.12 |
37.3: 변환 연산자 (Conversion Operator) (0) | 2021.12.28 |
37.2: 다중 상속된 객체를 원하는 기본 (base) 타입으로 캐스팅하기 (0) | 2021.12.13 |
37.1: 타입 변환 (casting) 없이 타입 호환성 여부 확인하기 (0) | 2021.12.09 |