C++/CLI casts operator illustration
After reading the excellent Cast Notation and Introduction of safe_cast<>, I thought I would try the following:
int main()
{
String ^ s = "string/chaîne/cadena" ;
Object ^ o = s ;
String ^ s1 = safe_cast<String ^>(o) ; // string s1 = (string) o;
// ldloc.0 / castclass string / stloc.3
Console::WriteLine( "{0} ({1})", s1, s1->GetType() ) ;
String ^ s2 = dynamic_cast<String ^>(o) ; // string s2 = o as string;
// ldloc.0 / isinst string / stloc.2
Console::WriteLine( "{0} ({1})", s2, s2->GetType() ) ; // ldloc.0 / stloc.1
o = 3 ; // boxing
String ^ s3 = static_cast<String ^>(o) ; // ldloc.0 / stloc.3
Console::WriteLine( "{0} ({1})", s3, s3->GetType() ) ;
return 0;
}
I had to compile with /clr:pure. What do you think the output is?
string/chaîne/cadena (System.String)
string/chaîne/cadena (System.String)
3 (System.Int32)
Hmmm…
For even more fun, look at the s3 value in the local or watch window!