To post z serii ciekawostki. Większość z Was zapytana od jakiej wartości zaczynają się indeksy tablic w C# odpowie z pewnością, że od 0 i tego należy się trzymać, ale są pewne wyjątki. Oto przykład na jaki natknąłem się eksplorując czeluście platformy .NET pokazujący jak stworzyć tablicę 10x10 z indeksami zaczynającymi się od 5:
Unable to cast object of type 'System.Int32[*]' to type 'System.Int32[]'.
Co oznacza zapis System.Int32[*]? Mówiąc szczerze nie jest do końca pewny. Bazując jednak na poniższym teście:
System.Int32[]
System.Int32[]
System.Int32[*]
System.Int32[,]
System.Int32[,]
Można stwierdzić, że nazwa typu TYP[*] oznacza po prostu tablicę jednowymiarową z indeksem nie zaczynającym się w zerze.
Na koniec jeszcze jedna ciekawostka. Rzutowanie System.Int32[*] na System.Int32[] w kodzie programu nie powiedzie się, ale już w oknie Quick Watch albo Immediate Window już tak:
var array = Array.CreateInstance(typeof(int), new[] { 10, 10 }, new[] { 5, 5 }); var array2 = (int[,]) array;A teraz mały przykład użycia:
array2[1,3] = 1 // Out of bounds array index array2[5,6] = 1 // OK array2[15,14] = 1 // Out of bounds array index array2[14,14] = 1 // OKOczywiście nie byłbym sobą gdybym nie spróbował tego samego z tablicą jednowymiarową:
var array = Array.CreateInstance(typeof(int), new[] { 10 }, new[] { 5 }); var array2 = (int[]) array;Taka próba rzutowania zakończy się niestety, a może na szczęście, wyjątkiem o treści:
Unable to cast object of type 'System.Int32[*]' to type 'System.Int32[]'.
Co oznacza zapis System.Int32[*]? Mówiąc szczerze nie jest do końca pewny. Bazując jednak na poniższym teście:
Console.WriteLine(new int[10].GetType()); Console.WriteLine(Array.CreateInstance(typeof(int), new[] { 10 }, new[] { 0 }).GetType()); Console.WriteLine(Array.CreateInstance(typeof(int), new[] { 10 }, new[] { 5 }).GetType()); Console.WriteLine(new int[10,10].GetType()); Console.WriteLine(Array.CreateInstance(typeof(int), new[] { 10, 10 }, new[] { 5, 5 }).GetType());Który wypisze na ekran takie wyniki:
System.Int32[]
System.Int32[]
System.Int32[*]
System.Int32[,]
System.Int32[,]
Można stwierdzić, że nazwa typu TYP[*] oznacza po prostu tablicę jednowymiarową z indeksem nie zaczynającym się w zerze.
Na koniec jeszcze jedna ciekawostka. Rzutowanie System.Int32[*] na System.Int32[] w kodzie programu nie powiedzie się, ale już w oknie Quick Watch albo Immediate Window już tak: