Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Poniższy temat dotyczy tylko środowiska uruchomieniowego języka wspólnego.
W przypadku użycia z typami CLR kompilator próbuje mapować rzutowanie w stylu C na jedną z rzutów wymienionych poniżej, w następującej kolejności:
const_cast
safe_cast
safe_cast i const_cast
static_cast
static_cast plus const_cast
Jeśli żadna z rzutów wymienionych powyżej nie jest prawidłowa, a typ wyrażenia i typ docelowy to typy odwołań CLR, rzutowanie w stylu C do sprawdzania środowiska uruchomieniowego (instrukcja castclass MSIL). W przeciwnym razie rzutowanie w stylu C jest uznawane za nieprawidłowe, a kompilator zgłasza błąd.
Uwagi
Rzutowanie w stylu C nie jest zalecane. Podczas kompilowania przy użyciu /clr (kompilacja środowiska uruchomieniowego języka wspólnego)użyj safe_cast.
Poniższy przykład przedstawia rzutowanie w stylu C, które mapuje na const_castelement .
// cstyle_casts_1.cpp
// compile with: /clr
using namespace System;
ref struct R {};
int main() {
const R^ constrefR = gcnew R();
R^ nonconstR = (R^)(constrefR);
}
Poniższy przykład przedstawia rzutowanie w stylu C, które mapuje na safe_cast.
// cstyle_casts_2.cpp
// compile with: /clr
using namespace System;
int main() {
Object ^ o = "hello";
String ^ s = (String^)o;
}
Poniższy przykład przedstawia rzutowanie w stylu C, które mapuje na safe_cast plus const_cast.
// cstyle_casts_3.cpp
// compile with: /clr
using namespace System;
ref struct R {};
ref struct R2 : public R {};
int main() {
const R^ constR2 = gcnew R2();
try {
R2^ b2DR = (R2^)(constR2);
}
catch(InvalidCastException^ e) {
System::Console::WriteLine("Invalid Exception");
}
}
Poniższy przykład przedstawia rzutowanie w stylu C, które mapuje na static_castelement .
// cstyle_casts_4.cpp
// compile with: /clr
using namespace System;
struct N1 {};
struct N2 {
operator N1() {
return N1();
}
};
int main() {
N2 n2;
N1 n1 ;
n1 = (N1)n2;
}
W poniższym przykładzie pokazano rzutowanie w stylu C, które mapuje element na static_cast znak plus const_cast.
// cstyle_casts_5.cpp
// compile with: /clr
using namespace System;
struct N1 {};
struct N2 {
operator const N1*() {
static const N1 n1;
return &n1;
}
};
int main() {
N2 n2;
N1* n1 = (N1*)(const N1*)n2; // const_cast + static_cast
}
Poniższy przykład przedstawia rzutowanie w stylu C, które mapuje na sprawdzanie czasu wykonywania.
// cstyle_casts_6.cpp
// compile with: /clr
using namespace System;
ref class R1 {};
ref class R2 {};
int main() {
R1^ r = gcnew R1();
try {
R2^ rr = ( R2^)(r);
}
catch(System::InvalidCastException^ e) {
Console::WriteLine("Caught expected exception");
}
}
Poniższy przykład przedstawia nieprawidłowe rzutowanie w stylu C, co powoduje, że kompilator wystawi błąd.
// cstyle_casts_7.cpp
// compile with: /clr
using namespace System;
int main() {
String^s = S"hello";
int i = (int)s; // C2440
}
Wymagania
Opcja kompilatora: /clr
Zobacz też
Rozszerzenia składników dla platformy .NET i platformy uniwersalnej systemu Windows