다음을 통해 공유


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-idInvalidCastException 지정된 형식으로 변환할 수 없는 경우 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) 식은 피연산자 expressiontype-id 형식의 개체로 변환합니다.

컴파일러는 safe_cast가 허용되는 대부분의 위치에 static_cast를 허용합니다. 그러나 safe_cast 확인 가능한 MSIL을 생성하는 반면, 확인할 수 없는 MSIL을 static_cast 생성할 수 있습니다. 안정형 코드에 대한 자세한 내용은 순수형 코드 및 안정형 코드(C++/CLI)Peverify.exe(PEVerify 도구)를 참조하세요.

마찬가지로 static_castsafe_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

참고 항목

.NET 및 UWP용 구성 요소 확장