더북(TheBook)

이 코드에서 is 연산자는 올바르게 사용되었지만, 타입 변환 연산자는 그렇지 못하다. C#에서는 타입 매개변수로 주어지는 타입으로 직접 타입 변환을 수행할 수 없는 오래된 문제가 있었고, 이를 해결하기 위한 고전적인 방법으로 object 타입으로 타입 변환을 수행하는 방법이 사용되곤 했다.

if (shape is Circle)
{
    Circle c = (Circle) (object) shape;
}

이러한 형태는 일반적인 타입 변환을 수행할 때도 어색하지만, 타입 패턴을 사용하려고 하면 더더욱 이상하게 보인다.

예제 12-15의 경우에는 매개변수로 IEnumerable<Shape>를 인수로 받거나(이는 List<Circle>IEnumerable<Shape>로 변환할 수 있는 제네릭 공변성의 장점을 활용하는 방법이다.) shape 변수의 타입을 T 대신 Shape 타입으로 지정하면 문제를 해결할 수 있다. 하지만 다른 경우에는 해결책이 이처럼 간단하지 않을 수 있다. C# 7.1부터는 as 연산자를 사용할 때 어떤 타입을 지정해도 문제가 되지 않도록 개선되었으며, 그 결과 예제 12-15도 정상적으로 컴파일된다.

C# 7.0에 포함된 세 가지 패턴 중에 타입 패턴이 가장 많이 사용될 것으로 기대된다. 사실 마지막 패턴은 거의 패턴으로도 보이지 않는다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.