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!

Comments (0)