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/

반응형

+ Recent posts