Casts de style C avec /clr (C++/CLI)
La rubrique suivante s'applique uniquement au common langage runtime.
En cas de utilisation avec les types CLR, le compilateur tente de mapper le cast de style C à l'un des casts listé ci-dessous, dans l'ordre suivant :
const_cast
safe_cast
safe_cast plus le const_cast
static_cast
static_cast plus le const_cast
Si aucun des casts ne le répertoriait est en haut valide, et si le type de l'expression et du type cible sont des types référence CLR, des cartes de cast de style C à un moment de l'exécution-contrôle (instruction de castclass MSIL).Sinon, le cast de style c est considéré comme valide et les problèmes de compilateur une erreur.
Notes
Le cast de style c n'est pas recommandé.Lors de la compilation avec, /clr (Compilation pour le Common Language Runtime)utilisez safe_cast (extensions du composant C++).
L'exemple suivant montre à c le cast de style qui mappe à const_cast.
// cstyle_casts_1.cpp
// compile with: /clr
using namespace System;
ref struct R {};
int main() {
const R^ constrefR = gcnew R();
R^ nonconstR = (R^)(constrefR);
}
L'exemple suivant montre à c le cast de style qui mappe à safe_cast.
// cstyle_casts_2.cpp
// compile with: /clr
using namespace System;
int main() {
Object ^ o = "hello";
String ^ s = (String^)o;
}
L'exemple suivant montre à c le cast de style qui mappe à 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");
}
}
L'exemple suivant montre à c le cast de style qui mappe à static_cast.
// 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;
}
L'exemple suivant montre à c le cast de style qui mappe à static_cast 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
}
L'exemple suivant montre à c le cast de style qui mappe à un contrôle à l'exécution.
// 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");
}
}
L'exemple suivant montre un cast de style C valide, qui effectue le compilateur à émettre une erreur.
// cstyle_casts_7.cpp
// compile with: /clr
using namespace System;
int main() {
String^s = S"hello";
int i = (int)s; // C2440
}
Configuration requise
option du compilateur : /clr