下面代碼中,不能裝箱,在強制類型轉換時出錯,因爲之前 c 是 class 類型,而卻要把它轉換爲 int 類型,這是不可以的。雖然編譯器能通過編譯,但是 runtime 在運行時會拋出 InvalidCastException 異常。
Circle c = new Circle(8);
object o = c; // 本條語句正確,但是不會裝箱,因爲裝箱是從棧到堆,需要的是值類型,而 c 是引用類型
int i = (int)o; // 編譯成功
// 編譯器編譯通過,但是運行時 runtime 會拋出一個 InvalidCastException
is 和 as 是 C# 提供的以安全的方式執行類型強制轉換的操作符,用法如下。
is 操作符驗證對象的類型是不是自己希望的。
WrappedInt wi = new WrappedInt();
object o = wi;
if (o is WrappedInt)
{
WrappedInt temp = (WrappedInt)o; // 轉型是安全的,o 已確定是一個 WrappedInt
}
as 操作符取一個對象和一個類型作爲其左邊和右邊的操作數。runtime 會嘗試將對象轉換成指定的類型,若轉換成功,就返回轉換成功後的結果給 temp,如果轉換失敗,返回 null 給 temp。
WrappedInt wi = new WrappedInt();
object o = wi;
WrappedInt temp = o as WrappedInt; // 轉型是安全的,o 已確定是一個 WrappedInt
if (temp != null)
{
// 只有轉換成功,這裏的代碼才能被執行
}