Разница между .MakeArrayType() и .MakeArrayType(1)

Согласно документации vs: MakeArrayType() представляет собой одномерный массив с нижней границей нуля. MakeArrayType(1) представляет массив с заданным числом измерений. Например, если тип UnderlyingSystemType int, возвращаемый тип MakeArrayType() равен System.Int32[], а тип возврата MakeArrayType(1) равен System.Int32[*].
В чем разница между этими типами.

Ответ 1

Существует тонкое различие между .MakeArrayType() и .MakeArrayType(1), как вы видели из возвращаемого типа (Int32[] versus Int32[*]). Согласно документации для .MakeArrayType():

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

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

Разница между Vector и Array довольно технична, но в основном Vectors получают специальное обращение со стороны CLR, поэтому есть дополнительные инструкции IL, которые работают с ними, и которые могут сделать их более эффективными. Дополнительные сведения о различиях между массивами и векторами см. В разделе http://markettorrent.com/community/7968#Vectors vs. Массивы