CLR 允许您将对象强制转换为它的类型或它的任何基类型。转换为基本类型已经被认为是安全的并且是隐式的。
例如。
对象 s = new String();
但是 CLR 希望您在转换为派生类型时指定显式转换
String str = s; // Give error and needs you to explicitly cast it
//To get it to work
String str = (String)s;
现在在这里发生的事情不是将它转换为字符串,而是检查是否是字符串类型。如果发现它是 String 类型,则强制转换成功,否则抛出 InvalidCastExcetion。
另外两种 case 方法是使用is和as运算符
is Operator :如果转换成功,则返回 true,否则返回 false。
例如
Object o = new Object();
Boolean b1 = (o is Object); // b1 is true
Boolean b2 = (o is DateTime); // b2 is false
所以在调用任何方法之前,通常你会写这样的代码
if(o is DateTime) // Check this by observing the object
{
DateTime d = (DateTime)o; // Again cast the object to obtain a reference
// Perform operations
}
这有点贵,因为 CLR 会强制转换两次。
为了避免这种情况,我们有as运算符。
as 运算符:返回对检查对象类型的引用,否则返回 null。
例如:
DateTime d = o as DateTime; // Check the object to verify the case and returns reference to the object itself or null
if(d != null)
{
// Perform the operations
}
所以你可以看到,使用 as operator 时性能略有提升。
这就是 CLR 在转换类型时必须提供的全部内容。
当涉及到您的代码时:
对象 str = "abc";
str.ToString() 将调用 System.object 类的 ToString 方法,这是一个虚拟方法。当调用虚方法时,CLR 会实际检查调用者指向的对象的类型。
这里的 str 实际上指向一个字符串对象。因此编译器将生成代码来调用 String 类的 ToString 方法,该方法将打印“abc”作为输出。这个概念是多态性,其中在调用任何类型的虚拟方法时,实际对象类型首先由 CLR 获取,然后在对象的正确类型上调用适当的方法,在您的情况下为 String 类型。