Можно ли в C# инициализировать массив, например, в субиндексе 1?
Я работаю с взаимодействием с Office, и каждое свойство представляет собой массив объектов, который начинается с 1 (я предполагаю, что он изначально был запрограммирован в VB.NET), и вы не можете его изменить, вы должны установить весь массив, чтобы он принимал изменения.
В качестве обходного пути я клонирую исходный массив, изменяю его и устанавливаю его как единое целое, когда закончу.
Но мне было интересно, можно ли создать новый ненулевой массив
Но вы можете создать их, если не хотите (новый массив (от 3 до 5) или что-то в этом роде)





Вы можете написать свой собственный класс массива
В VB6 вы можете изменить массив, чтобы он начинался с 0 или 1, поэтому я думаю, что VBScript может сделать то же самое. Для C# это невозможно, но вы можете просто добавить значение NULL в первый [0] и начать действительное значение с [1]. Конечно, это немного опасно ...
Свойства требуют, чтобы массив начинался с 1, поэтому это не сработает.
Не просто. Но вы, конечно, можете написать свой собственный класс. У него будет массив в качестве частной переменной, и пользователь будет думать, что его массив начинается с 1, но на самом деле он начинается с нуля, а вы вычитаете 1 из всех обращений к его массиву.
Да, вы всегда можете сделать что угодно сами ... вопрос в том, можно ли это сделать с помощью синтаксиса C#
Не думаю, можно ли изменить начальный индекс массивов.
Я бы создал свой собственный массив, используя дженерики, и обработал бы его внутри.
Просто сохраните const int с именем «смещение» со значением, равным единице, и всегда добавляйте его к своим индексам в коде.
Я не думаю, что в C# можно создавать ненулевые массивы, но вы могли бы легко написать собственный класс-оболочку вокруг встроенных структур данных. Этот класс-оболочка будет содержать частный экземпляр типа массива, который вам нужен; перегрузка оператора индексации [] не допускается, но вы можете добавить индексатор к классу, чтобы он вел себя как индексируемый массив, см. здесь. Затем написанная вами индексная функция может добавить (или вычесть) 1 ко всем переданным индексам.
Затем вы можете использовать свой объект следующим образом, и он будет вести себя правильно:
myArrayObject[1]; //would return the zeroth element.
Это можно сделать, как вы просите, см. Код ниже.
// Construct an array containing ints that has a length of 10 and a lower bound of 1
Array lowerBoundArray = Array.CreateInstance(typeof(int), new int[1] { 10 }, new int[1] { 1 });
// insert 1 into position 1
lowerBoundArray.SetValue(1, 1);
//insert 2 into position 2
lowerBoundArray.SetValue(2, 2);
// IndexOutOfRangeException the lower bound of the array
// is 1 and we are attempting to write into 0
lowerBoundArray.SetValue(1, 0);
+1: один блок полезного кода стоит тысячи ссылок нечитабельного кода о в прозе.
любой способ ввести это как int [] вместо массива?
Массивы vb.net тоже начинаются с 0.