as/is 只檢查執行時型別是否為目標型別或其衍生型別,忽略使用者定義轉型運算子。
強制轉型 (T)o 則會呼叫使用者定義的 implicit/explicit operator。
public class SecondType
{
private MyType _value;
public static implicit operator MyType(SecondType t) => t._value;
}
// 測試
object o = Factory.GetObject(); // 回傳 SecondType 實例
// as 失敗:o 不是 MyType,也非 MyType 衍生類
MyType t1 = o as MyType; // null
// 強制轉型成功:呼叫 implicit operator
MyType t2 = (MyType)o; // 回傳 t._value
| 情境 | 建議 |
|---|---|
| 標準繼承體系,要安全轉型 | as + null 檢查 |
| 型別有使用者定義轉型運算子 | 強制轉型 (T)o(配合 try/catch) |
| 值型別拆箱 | is 模式比對 / is + 強制轉型 |
| 不確定是否有使用者定義轉型 | 優先 as,失敗再考慮強制轉型 |
as 失敗只回傳 null,零例外開銷。強制轉型失敗拋 InvalidCastException,例外處理成本極高(微秒級)。高頻呼叫路徑必須用 as/is。
as 回傳 null,強制轉型也回傳 null(參考型別)as 回傳 null,強制轉型拋例外用 as 時,null 結果合併了兩種情況,若需區別請先檢查 o == null。