safe_cast(C++/CLI 및 C++/CX)
safe_cast 작업이 성공하면 지정한 식이 지정한 형식으로 반환되고, 실패하면 InvalidCastException
이 throw됩니다.
모든 런타임
(이 언어 기능에는 모든 런타임에 적용되는 설명이 없습니다.)
구문
[default]:: safe_cast< type-id >( expression )
Windows Runtime
safe_cast를 사용하여 지정한 식의 형식을 변경할 수 있습니다. 변수 또는 매개 변수를 특정 형식을 변환할 수 있다고 확신하는 경우 try-catch 블록 없이 safe_cast를 사용하여 개발 중에 프로그래밍 오류를 검색할 수 있습니다. 자세한 내용은 캐스팅(C++/CX)을 참조하세요.
구문
[default]:: safe_cast< type-id >( expression )
매개 변수
type-id
expression을 변환할 형식입니다. 참조 또는 값 형식에 대한 핸들, 값 형식 또는 참조 또는 값 형식에 대한 추적 참조입니다.
expression
참조 또는 값 형식에 대한 핸들, 값 형식 또는 참조 또는 값 형식에 대한 추적 참조로 계산되는 식입니다.
설명
식을 type-id로 InvalidCastException
지정된 형식으로 변환할 수 없는 경우 safe_cast throw됩니다. catchInvalidCastException
하려면 /EH(예외 처리 모델) 컴파일러 옵션을 지정하고 try/catch 문을 사용합니다.
요구 사항
컴파일러 옵션: /ZW
예제
다음 코드 예제에서는 Windows 런타임에서 safe_cast를 사용하는 방법을 보여 줍니다.
// safe_cast_ZW.cpp
// compile with: /ZW /EHsc
using namespace default;
using namespace Platform;
interface class I1 {};
interface class I2 {};
interface class I3 {};
ref class X : public I1, public I2 {};
int main(Array<String^>^ args) {
I1^ i1 = ref new X;
I2^ i2 = safe_cast<I2^>(i1); // OK, I1 and I2 have common type: X
// I2^ i3 = static_cast<I2^>(i1); C2440 use safe_cast instead
try {
I3^ i4 = safe_cast<I3^>(i1); // Fails because i1 is not derived from I3.
}
catch(InvalidCastException^ ic) {
wprintf(L"Caught expected exception: %s\n", ic->Message);
}
}
Caught expected exception: InvalidCastException
공용 언어 런타임
safe_cast를 사용하여 식의 형식을 변경하고 안정형 MSIL 코드를 생성할 수 있습니다.
구문
[cli]:: safe_cast< type-id >( expression )
매개 변수
type-id
참조 또는 값 형식에 대한 핸들, 값 형식 또는 참조 또는 값 형식에 대한 추적 참조입니다.
expression
참조 또는 값 형식에 대한 핸들, 값 형식 또는 참조 또는 값 형식에 대한 추적 참조로 계산되는 식입니다.
설명
safe_cast<
type-id>(
expression)
식은 피연산자 expression을 type-id 형식의 개체로 변환합니다.
컴파일러는 safe_cast가 허용되는 대부분의 위치에 static_cast를 허용합니다. 그러나 safe_cast 확인 가능한 MSIL을 생성하는 반면, 확인할 수 없는 MSIL을 static_cast
생성할 수 있습니다. 안정형 코드에 대한 자세한 내용은 순수형 코드 및 안정형 코드(C++/CLI) 및 Peverify.exe(PEVerify 도구)를 참조하세요.
마찬가지로 static_cast
safe_cast 사용자 정의 변환을 호출합니다.
캐스트에 대한 자세한 내용은 캐스팅 연산자를 참조하세요.
safe_cast (캐스팅const
)을 const_cast
적용하지 않습니다.
safe_cast는 cli 네임스페이스에 있습니다. 자세한 내용은 Platform, default 및 cli 네임스페이스를 참조하세요.
safe_cast에 대한 자세한 내용은 다음을 참조하세요.
요구 사항
컴파일러 옵션: /clr
예제
컴파일러가 a를 허용하지 static_cast
않지만 safe_cast 수락하는 한 가지 예는 관련 없는 인터페이스 형식 간의 캐스트에 대한 것입니다. safe_cast를 사용하면, 컴파일러에서 변환 오류가 발생하지 않고 런타임에 검사를 수행하여 캐스트가 가능한지 확인합니다.
// safe_cast.cpp
// compile with: /clr
using namespace System;
interface class I1 {};
interface class I2 {};
interface class I3 {};
ref class X : public I1, public I2 {};
int main() {
I1^ i1 = gcnew X;
I2^ i2 = safe_cast<I2^>(i1); // OK, I1 and I2 have common type: X
// I2^ i3 = static_cast<I2^>(i1); C2440 use safe_cast instead
try {
I3^ i4 = safe_cast<I3^>(i1); // fail at runtime, no common type
}
catch(InvalidCastException^) {
Console::WriteLine("Caught expected exception");
}
}
Caught expected exception