Невозможно включить List <int [*]> в список <int []>, созданный с отражением

Я создаю экземпляр a List<T> одномерных массивов 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);

Я вижу это странное поведение в самом списке:

Watch of the list instance as an object

Если я взаимодействую с ним через отражение, он, кажется, ведет себя нормально, однако, если я попытаюсь применить его к его фактическому типу:

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

Я получаю это исключение:

Невозможно применить объект типа 'System.Collections.Generic.List`1 [System.Int32 [*]]' для ввода 'System.Collections.Generic.List`1 [System.Int32 []]'.

Любые идеи, которые могут быть причиной этого или как его решить? Я работаю в visual studio 2010 express on.net 4.0.

Ответ 1

Проблема вызвана функцией MakeArrayType. Как вы его используете, вы создаете многомерный массив с одним измерением, который не совпадает с одномерным массивом (вектором).

В документации :

Общая среда исполнения языка делает различие между векторами (то есть одномерными массивами, которые всегда основаны на нуле) и многомерными массивами. Вектор, который всегда имеет только одно измерение, не совпадает с многомерным массивом, который имеет только одно измерение. Вы не можете использовать этот метод для перегрузки для создания векторного типа; если rank равно 1, этот метод перегрузки возвращает многомерный массив, который имеет одно измерение. Используйте метод MakeArrayType() для создания типов векторов.

Изменить:

Type typeIntArray = typeInt.MakeArrayType(1);

:

Type typeIntArray = typeInt.MakeArrayType();

чтобы создать обычный одномерный вектор.

Ответ 2

Что MSDN говорит о MakeArrayType(int):

Вы не можете использовать эту перегрузку метода для создания векторного типа; если ранг 1, этот метод перегрузки возвращает многомерный массив, который имеет одно измерение. Используйте перегрузку метода MakeArrayType()для создания типов векторов.