da error en el CLR, por que?
El tipo de error que recibirías en este caso, System.IndexOutOfRangeException y el mensaje de error que lo acompaña, "Índice fuera de los límites de la matriz" son lo suficientemente auto-descriptivos para hacerte una idea de lo que ocurre.
El índice de un Array en la programación .NET empieza por el número Cero, y la propiedad Count / Length devuelve el número de elementos en un Array.
Lo explicaré de otra forma:
Si tu añades cinco elementos a un array, el margen numérico que podrás utilizar en el indexer de ese array será desde el 0 hasta el 4:
Ejemplo:
Código
Es decir que puedes usar desde arr(0) hasta arr(4).
Dim arr As Object() = {item1, item2, item3, item4, item5}
Cuando llamas a la propiedad arr.Count / arr.Length, ésta devolverá la cantidad de elementos del array, es decir un valor de 5, puesto que el array contiene 5 elementos;
Entonces, al intentar iterar los elementos de la siguiente manera, estarías intentando acceder al índice arr(5), el cual no existe, y por lo tanto lanzaría un error:
Código
For i As Integer = 0 To arr.Length ' 0 To 5 Console.WriteLine(arr(i)) Next
Por eso se le debe descontar 1 al valor que devuelve la propiedad Count / Length:
Código
For i As Integer = 0 To (arr.Length - 1) ' 0 To (5 - 1) Console.WriteLine(arr(i)) Next
Lo mismo se aplicaría al ejemplo que pusiste de un búcle con la incrementación de la instrucción Step:
Código
For i As Integer = 0 To (arr.Length - 1) Step 1 ' 0 To (5 - 1) Increment 1 Console.WriteLine(arr(i)) Next
pero por eso se pone el -1? para que no salga del limite?
y que no llegue al 5 sino que se quede en el 4????
y que no llegue al 5 sino que se quede en el 4????
Exacto. Puesto que el índice de un array empieza por 0, la propiedad Count / Length siempre devolverá un valor mayor (un 1 más) puesto que lo que hace es contrar la cantidad de elementos del array, así que si un array contiene 1 elementos, Count / Length devolverá el valor "1", no "0"... evidéntemente.
¡Saludos!