방프리

24.04.28 Chapter5. 동적 프로그래밍 (Item 44) 본문

C#/More Effective C#

24.04.28 Chapter5. 동적 프로그래밍 (Item 44)

방프리 2024. 4. 28. 13:58

Item 44 : 동적 타이핑의 장단점을 이해하라

Cast<T>는 제네릭 메서드로, T타입으로 타입 변환이 가능하기만 하다면 어떤 타입이든 사용할 수 있다. 하지만 Cast<T>의 한계에 대해서 제대로 알지 못하면 예상대로 동작하지 않기에 제대로 알고 사용해야한다.

// 동작되지 않는 코드
var answer1 = GetSomeStrings().Cast<MyType>();
try
{
    foreach (var v in answer1)
        WriteLine(v);
}
catch (INvalidCastException)
{
    WriteLine("Cast Failed!");
}

Cast<T>는 인수 런타임 타입에서 제공하는 사용자 정의 변환 함수에는 접근할 수 없다. 단순히 참조 변환가 박싱 변환만 가능하기에 Cast<T>는 T가 System.Object에 정의된 멤버만 가지고 있다고 가정하므로 사용자 정의 변환 함수에는 접근할 수 없다.

// 동적 타이핑을 통해 문제를 해결한 코드
var answer = from v in GetSomeStrings()
             select (MyType)v;
foreach (var v in answer)
    WriteLine(v);

 

C# 4.0의 동적 타이핑을 활용하여 리플렉션을 이용한 형변환 코드를 살펴보자

public static IEnumerable<TResult> Convert<TResult>(
    this system.Collections.IEnumerable sequence)
{
    foreach (object item in sequence)
    {
        dynamic coercion = (dynamic)item;
        yield return (TResult)coercion;
    }
}

 

Comments