To add to what Rick has said, array indexes in C# run from zero, so a five element array called "a" will have five valid indexes:
a[0]
a[1]
a[2]
a[3]
a[4]
Any other value (i.e. 5 or more, or any negative value at all) is invalid, and you will get an error to tell you that - it's out of range, teh range being 0 to 4 inclusive.
But the Length of an array understandably runs from 0 as well: an empty array with no elements has a Length of 0 (and no valid values for its index), and array with one element has a Length of 1 (and just the one valid index: 0), two elements means a Length of 2 (and two indexes: 0 and 1), ... and an array with five elements has a Length of 5 (indexes 0, 1, 2, 3, 4 only).
So when your loop runs from 0 to the Length inclusive:
int a = 0;
while (a <= numbers.Length)
...
Then the indexes you are trying to use are 0, 1, 2, 3, 4, ... and 5. The final one will always give you an error because there are only five values in a five element array, and five valid indexes: 0, 1, 2, 3, and 4.
That's why you nearly always see "<" in loop guard code, and almost never "<="
Make sense?