Невозможно включить 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()
для создания типов векторов.