Согласно вашей схеме , (в ролевом классе) оно должно быть:
@Column(name="roleid")
.. вместо:
@Column(name="id")
Если Вы привыкли к языкам C/C ++/C#, Вы используетесь это, объявляя, что массив инициализирует его с число элементов в массиве.
C# : byte a[] = new byte[1]
объявит массив байтов с 1 элементом (upperBound = 0)
, поведение отличается в VB, где, при объявлении массива параметр, используемый в инициализации, представляет UpperBound массива.
VB.NET: Dim a(1) As Byte
объявит массив байтов с 2 элементами (upperBound = 1)
В Visual Basic размер массива объявляется с массивом верхняя граница , где большинство языков объявляет размер массива путем определения число элементов в массиве. Если Вы не знаете об этом, то Ваши массивы Visual Basic заканчивают тем, что были 1 элементом дольше, чем Вы ожидали:
VB.NET:
Dim a(1) as Byte ' under the hood, translated to byte[2]
Console.WriteLine("{0}", a.Length) ' output 2
a(0) = 7 ' No error, element exists
a(1) = 7 ' No error, element exists, array length is 2
a(a.Length) = 7 ' error: Index was outside the bounds of the array.
C#:
byte[] a = new byte[1];
Console.WriteLine("{0}", a.Length); // output 1
a[0] = 7 // No error, element exists
a[1] = 7 // error: Index was outside of bounds of the array. (because array length is 1)
a[a.Length] = 7; // error: Index was outside the bounds of the array.
причина, почему Microsoft разработала VB.NET для калибровки массивов на основе верхней границы, а не длины массива, состоит в том, чтобы помочь портировать код от VB6 до VB.NET. Начальный индекс массива VB6 равняется 1, если Вы не объявляете Основу Опции 0. Было распространено циклично выполнить через массив размера N использование For i = 1 To N
. Путем разработки VB.NET для интерпретации аргумента калибровки массива как верхней границы, а не числа элементов в массиве старый код VB6, который циклично выполнился от 1 до N, мог быть портирован непосредственно на VB.NET. Массив в VB.NET будет иметь один дополнительный элемент по сравнению с тем, что массив имел в VB6 (элемент в индексе 0), но иначе ведет себя, как он сделал в VB6.
Вы будете иногда видеть, что люди утверждают, что Visual Basic создает "потраченный впустую" элемент. Это только верно при портировании кода VB6 прежней версии, который не ожидал элемент в индексе 0. При написании нового кода просто необходимо помнить то, что параметр калибровки означает (верхняя граница, не количество элемента), и объявите массивы соответственно. Просто уменьшите свои параметры калибровки одним по сравнению с тем, что Вы видели бы в C#. Полученный массив будет иметь элементы от a(0)
до a(a.Length-1)
, точно так же, как массив C#.
Массив начинается с позиции 0. Вы определяете две позиции.
Если вам нужна только 1 позиция, то:
Dim a(0) As Byte
и вы получите a.Length как 1.
Длина Размера индекс каждого размера на основе 0, что означает, что это колеблется от 0 до его верхней границы. Поэтому длина данного размера больше 1, чем заявленная верхняя граница для того размера.
Каждый из предыдущих ответов содержит части правильного ответа, но не полный правильный ответ. Когда вы объявляете массив (как в вашем коде: Dim a (1) As Byte), число, которое вы вводите в объявление массива (в данном случае 1), НЕ является объявлением , сколько записей в массив, это объявление верхней границы массива.
Итак, в вашем объявлении вы создаете массив с 2 записями: a (0) и a (1)