Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Можно использовать Array.CreateInstance
.
Посмотрите типы массива в.NET
Возможно сделать, как Вы запрашиваете, см. код ниже.
// 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, но действительно это запускается в нуле, и Вы вычитаете 1 изо всех его доступов к массиву.
Я не думаю, возможно ли изменить начальное значение индекса массивов.
Я создал бы свой собственный массив с помощью дженериков и обработал бы его внутри.
Я не думаю, что можно создать ненулевые основанные массивы в C#, но Вы могли легко записать собственный класс обертки вокруг созданного в структурах данных. Этот класс обертки содержал бы частный экземпляр типа массива, которого Вы потребовали; при перегрузке [] не позволяется оператор индексирования, но можно добавить индексатор к классу, чтобы заставить его вести себя как индексируемый массив, видеть здесь. Индексная функция, которую Вы пишете, могла затем добавить (или вычесть), 1, ко всему индексу передал в.
Вы могли затем использовать свой объект следующим образом, и он будет вести себя правильно:
myArrayObject[1]; //would return the zeroth element.
Просто сохраните названного 'смещения' интервала константы со значением одного и всегда добавляйте это к своим нижним индексам в Вашем коде.
В VB6 Вы могли изменить массив для запуска с 0 или 1, таким образом, я думаю, что VBScript может сделать то же. Для C# это не возможно, но можно просто добавить Нулевое значение в первом [0] и запустить действительное значение в [1]. Конечно, это немного опасно...