Invalid Cast Exception

MSDN 참조:
일부 참조 형식 변환에서는 컴파일러가 캐스트의 유효성 여부를 확인하지 못합니다. 따라서 올바르게 컴파일된 캐스트 작업이 런타임에 실패할 수 있습니다. 다음 예제에서 볼 수 있는 것처럼, 런타임에 실패하는 형식 캐스트는 InvalidCastException을 throw하게 됩니다.

    class Animal
    {
        public void Eat() { Console.WriteLine("Eating."); }
        public override string ToString()
        {
            return "I am an animal.";
        }
    }
    class Reptile : Animal { }
    class Mammal : Animal { }
    class Sample
    {
        public void Test()
        {
            Run(new Mammal());
        }

        void Run(Animal a)
        {
            //Reptile r = (Reptile)a;
            Reptile r = a as Reptile;
            if (r != null)
            {
                Console.WriteLine("OK");
            }
        }
    }

Reptile r = (Reptile)a;
"InvalidCastException이(가) 처리도지 않았습니다." 에러 발생

위의 캐스팅을 아래와 같이 as를 사용하거나 IS 연산자를 사용하여 캐스팅 하는것이 안전하다.

Reptile r = a as Reptile;

참조)
https://msdn.microsoft.com/ko-kr/library/ms173105.aspx
http://theburningmonk.com/2010/04/net-tips-using-as-vs-casting-in-csharp/
https://msdn.microsoft.com/ko-kr/library/cc488006.aspx