Questa è una domanda abbastanza frequente. Per i dettagli, vedere la sezione 7.4.1 e 7.4.3.1 della specifica.
In breve: un metodo con un array params è applicabile sia nella "forma normale" che nella "forma espansa". Cioè, si può dire
PrintLength(new string[] {"hello"}); // normal form
PrintLength("hello"); // expanded form, translated into normal form by compiler.
Quando dato una chiamata che è applicabile in entrambe le forme , il compilatore sceglie sempre la forma normale sopra la forma estesa.
Supponiamo di aver scelto il modulo espanso ogni volta che erano applicabili entrambi. Supponiamo di avere
void M(params object[] x) {}
Come passeresti effettivamente un array nullo a questa cosa se scegliamo sempre la forma espansa? Quello sarebbe impossibile!
Supponiamo che hai detto
M(new object[] { "hello" });
e abbiamo sempre scelto la forma estesa. Cosa farebbe questo? Bene, una serie di oggetti è un oggetto, quindi questo sceglierebbe la forma espansa: renderebbe un'altra matrice, avvolgere questa cosa nell'array e passare quella!
La scelta della forma espansa rispetto alla forma normale porta a risultati pazzeschi. Scegliere sempre la forma normale sulla forma espansa è la cosa più sensata da fare.
fonte
2010-02-05 21:34:58
Buone informazioni! –
Buon post Eric. Potrei aggiungere che w/the first PrintLength (null), stai passando un valore nullo alla funzione, dove come nel caso del secondo esempio PrintLength (s) stai passando un puntatore a una stringa (riferimento) che in realtà non fa riferimento a nulla. Tuttavia, il riferimento esiste ancora nella memoria w/un valore di 0 poiché è un puntatore nullo. – regex
Ero sicuro al 90% che era il caso, ma quel 10% continuava a tormentarmi. – ChaosPandion