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;
ここで何が起こるかは文字列に変換されませんが、文字列型であるかどうかがチェックされます。文字列型であることが判明した場合、キャストは成功します。それ以外の場合、InvalidCastExcetionがスローされます。
ケースのもう2つの方法は、 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は2回キャストするため、これは少し高価です。
これを回避するために、as演算子があります。
as Operator:チェックされたオブジェクトのタイプへの参照を返します。そうでない場合は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
}
ご覧のとおり、演算子として使用するとパフォーマンスがわずかに向上します。
鋳造タイプに関しては、CLRが提供するのはこれだけです。
あなたのコードに関しては:
オブジェクトstr="abc";
str.ToString()は、仮想メソッドであるSystem.objectクラスのToStringメソッドを呼び出します。仮想メソッドを呼び出すとき、CLRは実際に呼び出し元が指すオブジェクトのタイプをチェックします。
ここで、strは実際には文字列オブジェクトを指しています。したがって、コンパイラは、「abc」を出力として出力するStringクラスのToStringメソッドを呼び出すコードを生成します。この概念はポリモーフィズムであり、任意のタイプの仮想メソッドを呼び出すときに、実際のオブジェクトタイプが最初にCLRによって取得され、次に適切なメソッドがオブジェクトの正しいタイプで文字列タイプとして呼び出されます。