Posso creare array MULTIdimensionali con un limite inferiore diverso da zero; lo spiega Richter nel suo libro alla pagina 318 e poi con un copia e incolla dello stesso esempio in SLAR alla pagina 49.
Ma se voglio "estrapolare" lo stesso metodo per un array UNIdimensionale in una sintassi immaginaria:
int[] a = new int[lb..ub]; // questa sintassi non è ancora implementata!
dove lb è lower bound (per esempio 100) e ub è upper bound (per esempio 1000), scrivere:
int[] a;
// dichiarare e inizializzare lb e ub...
a = (int[])Array.CreateInstance(typeof(int), new int[1]{ub - lb + 1}, new int[1]{lb});
dà a run-time l'errore System.InvalidCastException ("Specified cast is not valid").
Scrivendo in output il tipo dell'espressione qui sopra, vediamo che cast non è valido:
Console.WriteLine(Array.CreateInstance(typeof(int), new int[1]{ub - lb + 1}, new int[1]{lb}).ToString());
Questo WriteLine scrive a console per un array UNIdimensionale una roba mai vista e mai letta da nessuna parte:
System.Int32[*]
Se invece avessimo un array MULTIdimensionale (per esempio bidimensionale), l'output sarebbe:
System.Int32[,]
Praticamente, l'InvalidCastException si ottiene provando il cast da Int32[*] a Int32[]. Ma cosa vuol dire quell'asterisco? E perché sembra che non possa avere un array UNIdimensionale con il limite inferiore diverso da zero?