先看代碼:
ArrayList list = new ArrayList();
list.Add(1);
list.Add(2);
byte[] buf = new byte[2];
list.CopyTo(buf);
編譯通過,運行卻出錯。原因剖析:
ArrayList 內部用 object[] 存儲,值類型需裝箱為引用類型CopyTo 內部用 Array.Copy() 實現list.Add(1) 中 1 為 int,裝箱存入 object,拷貝時嘗試 int[] -> byte[] 高精度向低精度複製,失敗等價於:
int[] a1 = new int[2] {1, 2};
byte[] a2 = new byte[2];
Array.Copy(a1, a2, 2); // 錯誤
修復:裝箱前轉為目標類型:
ArrayList list = new ArrayList();
list.Add((byte)1);
list.Add((byte)2);
byte[] buf = new byte[2];
list.CopyTo(buf); // 正常
核心教訓:ArrayList 非類型安全,CopyTo 需目標數組元素類型與存儲實際類型相容。