Ответ 1
Документация объясняет разницу:
Общая среда исполнения языка делает различие между векторами (то есть одномерными массивами, которые всегда основаны на нуле) и многомерными массивами. Вектор, который всегда имеет только одно измерение, не совпадает с многомерным массивом, который имеет только одно измерение. Вы не можете использовать этот метод для перегрузки для создания векторного типа; если rank равно 1, этот метод перегрузки возвращает многомерный массив, который имеет одно измерение. Используйте метод MakeArrayType() для создания векторных типов.
В принципе, equal1
возвращает вектор, а equal2
возвращает многомерный массив, который имеет ранг 1.
В CLR два типа обрабатываются по-разному.
Интересно, что если вы создадите экземпляр типа, вы снова получите вектор:
var type = typeof(object).MakeArrayType(1);
// Create an instance with length 2
var array = Activator.CreateInstance(type, 2);
Console.WriteLine(array.GetType()); // System.Object[]
Console.WriteLine(type); // System.Object[*]
Array.CreateInstance
показывает такое же поведение: если вы запрашиваете массив с нижней границей 0 и ранга 1, он всегда будет создавать вектор:
var array = Array.CreateInstance(typeof(object), new[] { 2 }, new[] { 0 });
Console.WriteLine(array.GetType());
object[] objArray = (object[]) array; // This is fine
Если вы измените значение 0 на любое ненулевое значение, оно создаст System.Object[*]
, и приведение не будет выполнено.