object obj = new MyType();
MyType val = (MyType)obj; // 失敗拋 InvalidCastException
需包 try-catch,效能差、程式碼雜訊多。
MyType val = obj as MyType; // 失敗回傳 null,不拋例外
特性:
null,必須檢查後再使用。if (val != null) { /* 安全使用 */ }
| 情境 | as 適用? | 替代做法 |
|---|---|---|
| 類別之間無繼承關係 | ❌ 編譯錯誤 | 傳統強制轉型 + 實作 explicit operator |
| 實值型別 (int、struct 等) | ❌ 編譯錯誤 | 先 is 判斷,再強制轉型 |
if (obj is int i) { Console.WriteLine(i); } // C# 7+ 模式比對
舊版寫法:
if (obj is int) { int i = (int)obj; }
| 來源 → 目標 | 建議方式 |
|---|---|
| object → 已知參考型別 | as + null 檢查 |
| object → 已知實值型別 | is 判斷 + 強制轉型 |
| 參考型別 → 無關參考型別 | 實作 explicit operator + 強制轉型 |
| 實值型別 → 實值型別 | Convert 靜態方法 |
using (var fs = new FileStream(@"d:\log.txt", FileMode.Create))
{
object obj = fs;
// 隱式轉型:object → Stream
Stream s = obj as Stream;
if (s != null) Console.WriteLine("Stream 轉型成功");
// 顯式轉型:object → FileStream (需 is 確認)
if (obj is FileStream ffs) Console.WriteLine("FileStream 轉型成功");
}
try-catch 包裹強制轉型,提升可讀性與效能。