Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Руководство_по_C++_CLI.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
8.1 Mб
Скачать

1.4.16 Приведение типов

См. проект CLI_Review.

Определены следующие способы приведения типов (как и в стандартном С++ ):

  • dynamic_cast - динамическое приведение типа;

  • safe_cast - безопасное приведение типа;

  • явное приведение типа (explicit type conversion).

dynamic_cast (динамическое приведение типа) позволяет проверить, на этапе выполнения программы, действительно ли дескриптор может быть приведен к другому типу. Если приведение возможно, то оно выполняется. Если же приведение невозможно, результатом будет нулевой дескриптор. Если "возврат" нулевого значения недопустим, возникает исключительная ситуация.

Void DynamicCast()

{

Object^ obj = "123";

IComparable^ icomp = dynamic_cast<IComparable^>(obj);

If(icomp)

{

int value = icomp->CompareTo("ABC");

Console::WriteLine(" Использование интерфейса"

" IComparable возможно, результат: {0}",value); // вывод -1

}

else

{

Console::WriteLine("Объект не может использовать"

" IConvertible");

}

/*Замечание: если принять obj=123, то приведение типа пройдет

успешно,но вот при выполнении функции CompareTo возникнет

ошибка, так как сравнение целого со строкой недопустимо*/

}

safe_cast (безопасное приведение типа) есть возможность приведения дескриптора базового типа к производному, если это действительно безопасно. Если же это невозможно, выбрасывается ИС InvalidCastException. Это приведение типа может также использовать определенные программистом преобразования.

Void SafeCast()

{

// Base to derived casts

Object^ obj = "Панас";

try

{

Version^ v = safe_cast<Version^>(obj); // вызывает ИС

Console::WriteLine("Объект Version^ {0}\n",

v->ToString());

}

catch (InvalidCastException^)

{

Console::WriteLine("Объект не Version^");

}

String^ str = safe_cast<String^>(obj); // допустимо

Console::WriteLine("Объект строка: {0}", str); //Панас

// Определенное пользователем преобразование

Decimal d(19.99);

// float f=d; вызывает ошибку на этапе компиляции

float f = safe_cast<float>(d);// допустимо

Console::WriteLine("Значение float после преобразования: {0}",

f); //19.99

}

Явное приведение типа (explicit type conversion) называют также приведением в стиле языка С. Для CLR типов и дескрипторов такое приведение всегда генерирует верифицируемый код. В большинстве случаев оно эквивалентно safe_cast.

Void ExplicitTypeConversion()

{

// Приведение базового типа к производному

Object^ obj = "Жаба";

try

{

Version^ v = (Version^)obj; // Вызывает ИС

Console::WriteLine("Объект Version^ равен {0}\n", v->ToString());

}

catch (InvalidCastException^)

{

Console::WriteLine("Объект не Version^");

}

String^ str = (String^)obj;

Console::WriteLine("Объект строка: {0}", str); //Жаба

// Определенное пользователем преобразование

Decimal d(20.01);

float f = (float)d;

Console::WriteLine("Значение float после преобразования: {0}"

, f); // 20.01

}