Управляемое приведение типов
Ключевое слово _try_cast приводит к возникновению исключения System::InvalidCastException при попытке выполнить приведение типов, не поддерживаемое общеязыковой средой выполнения CLR. Это похоже на возникновение исключения bad_cast при выполнении оператора dynamic_cast в C++ и на исключение ClassCastException, возникающее при некорректном приведении типов в Java. Хотя по своему действию оператор _try_cast больше похож на оператор dynamic_cast, чем на оператор static_cast, _try_cast в действительности задуман как временная замена оператора static_cast, применяемая на стадии разработки приложений.
После анализа всех возникающих при выполнении _try_cast исключений и внесения соответствующих исправлений в программу, операторы _try_cast обычно заменяются операторами static_cast. В следующем примере продемонстрировано использование операторов _try_cast для выявления некорректных приведений типов.
//TryCastExample.cpp fusing <mscorlib.dll> using namespace System; // использовать пространство имен Система; _gc class Mammal // класс сборщика мусора Млекопитающее { }; _gc class Dog: public Mammal // класс сборщика мусора Собака: общедоступное Млекопитающее { }; _gc struct Cat: public Mammal // сборщик мусора; Кот: общедоступное Млекопитающее { }; void main() { Mammal *pMammal = new Dog; // Млекопитающее *pMammal = новая Собака; try // пробовать { Dog *pDog = _try_cast <Dog *>(pMammal); // хорошо // Собака *pDog = _ try_cast <Собака *> (pMammal); Console::WriteLine("_try_cast <Dog *>"); // Собака – // хорошо Cat *pCat = _try_cast <Cat *>(pMammal); // плохо! // Кот *pCat = _ try_cast <Кот *> (pMammal); Console::WriteLine("_try_cast <Cat *>"); // Кот – // пропустить } catch(InvalidCastException *pe) { Console::WriteLine("Ooops: {0}", pe › get_Message()); } }
Приведенная программа напечатает:
_try_cast <Dog *> Ooops: Exception of type System.InvalidCastException was thrown.