Jest to szczególnie myląca funkcja języka C#. Oto oferta.
Podczas tej dyskusji zakładamy, że typ elementu tablicy jest typem odniesienia, a nie typem wartości.
C# obsługuje niebezpieczną kowariancję tablicową. Oznacza to, że jeśli masz tablicę ciąg, można przekonwertować je do tablicy obiektu, ponieważ łańcuch można przekształcić do obiektu:
string[] a1 = { "hello", "goodbye" };
object[] a2 = a1; // Legal
Jeśli następnie postarać się o element z A2 to działa:
object o3 = a2[0];
to legalne bo a2[0]
jest naprawdę a1[0]
, który jest ciągiem znaków, którą można przekształcić w obiekt.
Jeśli jednak próbować zapisu do tablicy, a następnie dostaniesz błąd przy starcie:
a2[0] = new object();
To nie w czasie wykonywania, ponieważ a2
jest naprawdę tablicą łańcuchów, i nie można wstawić nie-ciągu w tablicę łańcuchów.
Więc C# jest już potwornie zepsute; możliwe jest napisanie programu, który kompiluje i wygląda normalnie, ale nagle ulega awarii z wyjątkiem typu w czasie wykonywania, ponieważ próbowałeś umieścić obiekt w tablicy obiektów, która nie jest tak naprawdę tablicą obiektów.
Funkcja, której potrzebujesz, to , jeszcze bardziej zepsuta niż ta, a dzięki uprzejmości C# nie obsługuje jej. Funkcja chcesz to:
object[] a4 = { "Hello" };
string[] a5 = a4;
To byłoby niebezpieczne tablica kontrawariancja. Łamie strasznie tak:
a4[0] = new Customer(); // Perfectly legal
string s6 = a5[0];
A teraz po prostu skopiowany Klientowi do zmiennej typu ciąg.
Powinieneś unikać wszelkiego rodzaju macierzy kowariancji lub kontrawariancji; Tablica wariancji jest, jak już odkryłeś, niezgodna z prawem, a kowariancja tablicowa tworzy w twoim programie mało bomb czasowych, które niespodziewanie znikają. Przygotuj tablice odpowiedniego typu.
Jak rzucasz swoją tablicą? Jako całość? Musisz rzucić każdy element swojej tablicy indywidualnie. – Msonic
Tak, wyraźnie rzuca to jako całość. –
Wariancja układu odniesienia jest odwrotna; możesz rzucić coś, co jest ** faktycznie ** a string [] 'jako' object [] ', ale aby pójść w inny sposób musi to być' string [] ' –