11

List<T>リフレクションによって1 次元Int32配列をインスタンス化しています。次を使用してリストをインスタンス化すると:

Type typeInt = typeof(System.Int32);
Type typeIntArray = typeInt.MakeArrayType(1);
Type typeListGeneric = typeof(System.Collections.Generic.List<>);
Type typeList = typeListGeneric.MakeGenericType(new Type[] { typeIntArray, });

object instance = typeList.GetConstructor(Type.EmptyTypes).Invoke(null);

リスト自体にこの奇妙な動作が見られます。

オブジェクトとしてのリスト インスタンスの監視

リフレクションを介してインターフェイスすると、正常に動作するように見えますが、実際の型にキャストしようとすると:

List<int[]> list = (List<int[]>)instance;

私はこの例外を受け取ります:

タイプ 'System.Collections.Generic.List`1[System.Int32[*]]' のオブジェクトをタイプ 'System.Collections.Generic.List`1[System.Int32[]]' にキャストできません。

これを引き起こしている可能性のあるもの、またはそれを解決する方法はありますか? 私は .net 4.0 の Visual Studio 2010 Express で作業しています。

4

2 に答える 2

11

この問題はMakeArrayType関数によって引き起こされます。あなたがそれを使用している方法では、1 次元配列 (ベクトル) と同じではない 1 次元の多次元配列を作成します。

ドキュメントから:

共通言語ランタイムは、ベクトル (つまり、常に 0 から始まる 1 次元配列) と多次元配列を区別します。常に 1 次元しか持たないベクトルは、たまたま 1 次元しか持たない多次元配列と同じではありません。このメソッドのオーバーロードを使用してベクター型を作成することはできません。ランクが 1 の場合、このメソッド オーバーロードはたまたま 1 つの次元を持つ多次元配列型を返します。MakeArrayType() メソッドのオーバーロードを使用して、ベクター型を作成します。

変化する:

Type typeIntArray = typeInt.MakeArrayType(1);

これに:

Type typeIntArray = typeInt.MakeArrayType();

通常の 1 次元ベクトルを作成します。

于 2013-10-06T20:59:25.410 に答える
3

MSDNが述べていることMakeArrayType(int):

このメソッドのオーバーロードを使用してベクター型を作成することはできません。ランクが 1 の場合、このメソッド オーバーロードはたまたま 1 つの次元を持つ多次元配列型を返します。メソッド オーバーロードを使用して、MakeArrayType()ベクター型を作成します。

于 2013-10-06T21:01:15.637 に答える