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!