2009-02-19 43 views
3

我想從一個ArrayList中的值範圍創建一個數組,但得到錯誤「源數組中至少有一個元素不能被轉換爲目標數組類型」。爲什麼不能在ArrayList.GetRange後拋棄dotnet 1.1?

爲什麼以下方法會失敗,您會怎麼做?

int[] ints = new int[] { 1, 2, 3 }; 
ArrayList list = ArrayList.Adapter(ints); 
int[] mints = (int[])list.GetRange(0, 2).ToArray(typeof(int)); 
+0

它在2.0的工作 – 2009-02-19 22:16:45

+0

試試它與一個非值類型(例如字符串)它可能是一些問題與拳擊 – ShuggyCoUk 2009-02-20 08:29:33

回答

3

這是.NET 1.1中的一個已知錯誤,並已在.NET 2.0中修復。

GetRange的行爲在此版本中被破壞。如果嘗試使用GetRange返回的ArrayList封裝器實例的無參數ToArray()列出返回值的內容,則會看到它包含空引用和其他不一致的值。

查看帖子從2004年12月herehere,在BCL團隊博客。

0

如果你能使用數組,或許只是Array.Copy

int[] ints = new int[] { 1, 2, 3 }; 
    int[] mints = new int[2]; 
    Array.Copy(ints, 0, mints, 0, 2); 

或者,它看起來像你必須創建數組和循環/施放。

(用於信息,它工作正常「原樣」上2.0 - 雖然你會使用List<int>代替)

0

這個作品在DOTNET的2.0精細,所以我建議通過比較反彙編代碼框架看起有什麼區別。

在2.0中,調用ArrayList.Adapter()返回一個ArrayList.IListWrapper(它繼承ArrayList),它簡單地包裝了一個IList(在你的情況下是一個int []類型的數組)。在IListWrapper上調用ToArray會調用底層數組上的IList.CopyTo。

很顯然,這必須在1.1中以不同的方式實現,因爲它在2.0中設置的方式,它不會失敗。

0

通常情況下,這應該只是工作:

(int[])list.GetRange(0, 2).ToArray(typeof(int)); 

由於GetRange只是返回一個新的ArrayList。

你確定你的ArrayList只包含整數,沒有別的嗎?

我無法在.NET 1.1中測試它,但我想: - 您的ArrayList包含其他類型的元素,然後是int。 - ArrayList.Adapter方法是問題的鼻祖。

而且,你爲什麼不初始化像這樣的ArrayList:

ArrayList l = new ArrayList (new int[] {0, 1, 2, 3, 4, 5});