4

ArrayList 内の値の範囲から配列を作成したいのですが、「ソース配列の少なくとも 1 つの要素を目的の配列型にキャストできませんでした」というエラーが表示されます。

以下が失敗する理由と、代わりに何をしますか?

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

4 に答える 4

3

これは .NET 1.1 の既知のバグで、.NET 2.0 で修正されています。

このリリースでは、GetRange の動作が壊れています。GetRange によって返された ArrayList ラッパー インスタンスに対してパラメーターなしの ToArray() を使用して戻り値の内容を一覧表示しようとすると、null 参照やその他の矛盾した値が含まれていることがわかります。

2004 年 12 月の記事は、こちらこちらの BCL チーム ブログでご覧ください。

于 2009-02-21T05:10:23.187 に答える
0

これは DotNet 2.0 では問題なく機能するため、逆アセンブルされたフレームワーク コードを比較して違いを確認することから始めることをお勧めします。

2.0 では、ArrayList.Adapter() を呼び出すと、単純に IList (この場合は int[] 型の配列) をラップする ArrayList.IListWrapper (ArrayList から継承) が返されます。IListWrapper で ToArray を呼び出すと、基になる配列で IList.CopyTo が呼び出されます。

明らかに、これは 1.1 では別の方法で実装する必要があります。これは、2.0 での設定方法では失敗しないためです。

于 2009-02-19T22:12:38.800 に答える
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});

?

于 2009-02-19T22:13:05.287 に答える
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>代わりに使用します)

于 2009-02-19T21:54:00.153 に答える