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

C# ArrayList.CopyTo 執行期錯誤根因分析與類型安全修正指南

     編輯:關於C#

ArrayList.CopyTo 編譯通過、執行拋 InvalidCastException 或 ArrayTypeMismatchException,是經典的「盒裝/解盒型別不匹配」陷阱。

問題重現


var list = new ArrayList();
list.Add(1);      // int → boxed 為 object
list.Add(2);
byte[] buf = new byte[2];
list.CopyTo(buf); // 執行期錯誤!

根因深度剖析

  1. ArrayList 內部以 object[] 儲存
  2. list.Add(1):int 被盒裝為 object
  3. CopyTo(byte[]) 內部呼叫 Array.Copy(object[], byte[])
  4. Array.Copy 嘗試將 object[] 元素直接複製到 byte[]
  5. 關鍵點:object[] 實際元素型別為 int(盒裝),目標為 byte。陣列協變僅支援參考型別,int → byte 屬於數值縮小轉換,陣列複製不支援隱式數值轉換

等價簡化模型


int[] src = { 1, 2 };
byte[] dst = new byte[2];
Array.Copy(src, dst, 2); // 同樣失敗:int[] → byte[] 不支援

修正方案

方案一:存入時指定正確型別(推薦)


var list = new ArrayList();
list.Add((byte)1);  // 明確盒裝為 byte
list.Add((byte)2);
byte[] buf = new byte[2];
list.CopyTo(buf);   // 成功:object[] 含 byte → byte[] 協變合法

方案二:改用泛型 List<T>(現代最佳實踐)


var list = new List { 1, 2 };
byte[] buf = new byte[2];
list.CopyTo(buf);   // 編譯期型別安全,零盒裝,效能最佳

方案三:手動轉換複製


var list = new ArrayList { 1, 2 };
byte[] buf = list.Cast().ToArray(); // LINQ 專案轉換
// 或
byte[] buf = new byte[list.Count];
for (int i=0; i

核心原則

  • ArrayList 已過時:.NET 2.0+ 應全面改用 List<T>,編譯期型別安全、無盒裝開銷、效能優越
  • 若必須維護舊代碼:存入時確保盒裝型別與目標陣列元素型別完全一致
  • 陣列協變規則:Derived[] → Base[](僅參考型別),值型別陣列不支援協變

此錯誤揭示了 .NET 型別系統中「盒裝值型別在陣列協變中的邊界條件」,是理解 CLR 型別安全機制的絕佳切入點。

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