Questa è una caratteristica particolarmente confuso di C#. Ecco l'accordo.
In questa discussione si assume che il tipo di elemento di un array sia un tipo di riferimento, non un tipo di valore.
C# supporta covarianza di matrice non sicura. Ciò significa che se si dispone di una vasta gamma di stringa, è possibile convertirlo in un array di oggetti, perché una stringa può essere convertito in un oggetto:
string[] a1 = { "hello", "goodbye" };
object[] a2 = a1; // Legal
Se quindi si tenta di ottenere un elemento di a2, funziona:
object o3 = a2[0];
Questo è legale perché a2[0]
è davvero a1[0]
, che è una stringa, che è convertibile in oggetto.
Tuttavia, se si tenta di scrivere alla matrice, allora si otterrà un errore in fase di esecuzione :
a2[0] = new object();
questo non riesce in fase di esecuzione perché a2
è davvero un array di stringhe, e non puoi mettere una non stringa in una serie di stringhe.
Quindi C# è già orribilmente rotto; è possibile scrivere un programma che si compila e sembra normale ma si blocca improvvisamente con un'eccezione di tipo in fase di esecuzione perché si è tentato di inserire un oggetto in una matrice di oggetti che in realtà non è una matrice di oggetti.
La funzione desiderata è ancora più difettosa di quella, e grazie a Dio C# non la supporta. La funzione che si desidera è:
object[] a4 = { "Hello" };
string[] a5 = a4;
Sarebbe pericoloso serie controvarianza. Si rompe orribilmente simile a questo:
a4[0] = new Customer(); // Perfectly legal
string s6 = a5[0];
E ora abbiamo appena copiato un clienti in una variabile di tipo stringa .
È necessario evitare qualsiasi tipo di covarianza o controvariante dell'array; La contravarianza dell'array è, come hai scoperto, non legale, e la covarianza dell'array sta facendo delle piccole bombe a orologeria nel tuo programma che esplodono inaspettatamente. Crea gli array del tipo giusto per iniziare.
Come stai trasmettendo il tuo array? Nel complesso? È necessario eseguire il cast di ogni elemento dell'array singolarmente. – Msonic
Sì, lo sta chiaramente rilasciando nel suo insieme. –
La varianza della matrice di riferimento è l'altro modo; puoi lanciare qualcosa che è ** in realtà ** un 'string []' come un 'oggetto []', ma per andare nell'altro modo deve essere effettivamente una 'stringa []' –