2012-08-22 15 views
10

że aby utworzyć niezerowym dolna granica jeden układ wymiarowe C# wywołującC# Array.CreateInstance: nie można rzutować obiektu typu [*] wpisać []

Array.CreateInstance(typeof(int), new int[] { length }, new int[] { lower }); 

Typ zwrócony array nie jest int [], ale int [*]. Czy ktokolwiek może rozwinąć, co to oznacza? Chcę móc zwrócić tę tablicę dzwoniącemu, na przykład:

int[] GetArray() { ... } 

Dzięki.

+0

Gdzie widzisz 'int [*] '? Po uruchomieniu tego kodu otrzymuję tablicę 'int's. –

+0

D Stanley, at Array.CreateInstance (typeof (int), nowy int [] {6}, nowy int [] {6}). GetType(). FullName –

+1

Każdy powód, dla którego nie chcesz używać 'new int [ długość] '? Jest krótszy, używa standardowej składni i działa ... – Servy

Odpowiedz

12

Tak, to jest haczyka!

Istnieje różnica między wektorowym a tablicą jednowymiarową. Numer int[] to . Wektor (taki jak int[]) musi być oparty na 0. W przeciwnym razie musisz go nazwać Array. Na przykład:

// and yes, this is doing it the hard way, to show a point... 
int[] arr1 = (int[]) Array.CreateInstance(typeof(int), length); 

lub (zauważyć, że jest to nadal zero-based):

int[] arr2 = (int[]) Array.CreateInstance(typeof (int), 
     new int[] {length}, new int[] {0}); 

Jeśli tablica nie może być oparty o 0, to przepraszam: trzeba użyć Array, nie int[]:

Array arr3 = Array.CreateInstance(typeof(int), 
     new int[] { length }, new int[] { lower }); 

Aby jeszcze bardziej mylące, istnieje różnica pomiędzy:

typeof(int).MakeArrayType() // a vector, aka int[] 
typeof(int).MakeArrayType(1) // a 1-d array, **not** a vector, aka int[*] 
2

Nie mogę znaleźć właściwego kodu do zweryfikowania, ale eksperymentowanie tej składni wydaje się wskazywać jednowymiarową tablicę z niezerową podstawą.

Oto moje wyniki:

0-Based 1-D Array :  "System.Int32[]" 
Non-0-based 1-D Array:  "System.Int32[*]" 
0-based 2-D Array :  "System.Int32[,]" 
Non-0-based 2-D Array : "System.Int32[,]" 
2

Jeśli wszystko czego potrzebujesz to tablica jednowymiarowa, niż to powinno załatwić sprawę

Array.CreateInstance(typeof(int), length) 

Po określeniu dolne, następnie powrót typ jeśli różni

var simpleArrayType = typeof(int[]); 

var arrayType = Array.CreateInstance(typeof(int), 10).GetType(); 
var arrayWithLowerSpecifiedType = Array.CreateInstance(typeof(int), 10, 5).GetType(); 

Console.WriteLine (arrayType == simpleArrayType); //True 
Console.WriteLine (arrayWithLowerSpecifiedType == simpleArrayType); //False 
Powiązane problemy