ArrayList 内の値の範囲から配列を作成したいのですが、「ソース配列の少なくとも 1 つの要素を目的の配列型にキャストできませんでした」というエラーが表示されます。
以下が失敗する理由と、代わりに何をしますか?
int[] ints = new int[] { 1, 2, 3 };
ArrayList list = ArrayList.Adapter(ints);
int[] mints = (int[])list.GetRange(0, 2).ToArray(typeof(int));
これは DotNet 2.0 では問題なく機能するため、逆アセンブルされたフレームワーク コードを比較して違いを確認することから始めることをお勧めします。
2.0 では、ArrayList.Adapter() を呼び出すと、単純に IList (この場合は int[] 型の配列) をラップする ArrayList.IListWrapper (ArrayList から継承) が返されます。IListWrapper で ToArray を呼び出すと、基になる配列で IList.CopyTo が呼び出されます。
明らかに、これは 1.1 では別の方法で実装する必要があります。これは、2.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});
?
配列を操作できる場合は、おそらく次のようにします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>代わりに使用します)