L'unico modo che ho trovato possibile per utilizzare gli array unidimensionali di limite inferiore diverso da zero è questo che risulta dal seguente snippet:
int lb = 100; // limite inferiore
int ub = 1000; // limite superiore
// int[] a = new int[lb..ub];
Array a = Array.CreateInstance(typeof(int), new int[1]{ub - lb + 1}, new int[1]{lb});
// a[111] = 1;
a.SetValue(1, 111);
Console.WriteLine("a[{0}] = {1}", 111, a.GetValue(111));
Si può verificare che:
- il tipo di a è System.Int32[*] (ancora non ho capito bene il significato dell'asterisco che appare solo nel caso di un array unidimensionale creato con System.Array.CreateInstance e con il limite inferiore diverso da zero);
- gli array unidimensionali col limite inferiore zero creati tramite lo stesso CreateInstance hanno il tipo System.Int32[];
- nei tipi degli array multidimensionali non appare l'asterisco, indipendentemente da come sono stati creati o dai valori dei loro limiti inferiori;
- il rank di a è 1 (è unidimensionale);
- il limite inferiore di a è 100 (lb);
- il limite superiore di a è 1000 (ub);
- il tipo base di System.Int32[*] è System.Array;
- System.Type.GetType("System.Int32[*]") non è null (ma, come ci aspettiamo, System.Int32[*]);
- non è possibile accedere in modo indicizzato agli elementi dell'array (si devono utilizzare i metodi SetValue e GetValue).
Qualcuno sa come si presenta la situazione in VB.NET? Grazie a tutti per i commenti lasciati al post precedente.