首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Effective C# 原則 3:優先使用 is 或 as 運算子,避免強制轉型(三)

     編輯:關於C語言

編譯時期與執行時期型別的落差

兩種轉換都失敗了。但我告訴過你,強制轉換可在使用者定義型別上完成。你以為會成功,確實若如你所想會成功。但轉換失敗,因為編譯器為物件 o 產生的程式碼基於編譯時期型別;對執行時期物件 o,編譯器一無所知,視其為 System.Object。編譯器認為不存在從 System.Object 到使用者型別 MyType 的轉換。它檢查了 System.Object 和 MyType 的定義,缺少使用者定義轉換,故產生檢查執行時期物件 o 是否為 MyType 的程式碼。因 o 實為 SecondType,故失敗。編譯器並不檢查實際執行時期物件是否可轉換為 MyType。

正確的轉換寫法

使用下列程式碼片段,可成功完成從 SecondType 到 MyType 的轉換:

object o = Factory.GetObject();
// Version three:
SecondType st = o as SecondType;
try {
    MyType t;
    t = (MyType)st;
    if (t != null) {
        // work with T, it's a MyType.
    } else {
        // Report a null reference failure.
    }
} catch {
    // report the failure.
}

雖不應寫出如此糟糕的程式碼,但確解決了常見難題。你可撰寫一個函式,接受 System.Object 參數並完成正確轉換:

object o = Factory.GetObject();
DOStuffWithObject(o);
private void DOStuffWithObject(object o2)
{
    try {
        MyType t;
        t = (MyType)o2; // Fails. o is not MyType
        if (t != null) {
            // work with T, it's a MyType.
        } else {
            // Report a null reference failure.
        }
    } catch {
        // report the conversion failure.
    }
}

使用者定義型別轉換的編譯時期綁定

記住,對使用者定義型別的物件,轉換運算僅在編譯時期,而非執行時期。執行時期 o2 與 MyType 間不存在轉換關係,因為編譯器不知也不關心。以下陳述式行為取決於 st 的宣告型別:

t = (MyType)st;

(譯註:若 st 為使用者定義型別,上述轉換在編譯時期進行。編譯器將 st 視為 System.Object 產生 IL,故執行時期無法將 Object 轉為 MyType。解決辦法是先轉為 SecondType,再強制轉為 MyType。若 st 為內建型別,轉換在執行時期,或許成功。)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved