Grundsätzlich Ihre Methodensignatur ein oder mehr Objekte zu nehmen und sie in ein Array myParam
genannt zu konsolidieren. Wenn mehrere Objekte einzeln übergeben werden, z. B. der Aufruf UsingParams(1, "hello", ...)
, werden sie automatisch in das Array object[]
konvertiert. Dies ist ein Compiler Trick/syntaktischer Zucker.
Wenn das übergebene Objekt kein object[]
Array oder eine Liste einzelner Objekte ist, wird es das erste Argument Ihres Arrays. Mit anderen Worten, wenn Sie eine int[]
übergeben, dann wird Ihr myParam
ein Array sein, dessen erstes Element ebenfalls ein Array ist, was es zu einem gezackten Array macht. Dies liegt daran, int[]
ist ein object
und der Compiler ist nicht schlau genug, um herauszufinden, was Sie tun, und macht es zum einzigen Element der object[]
Array. Es gibt keine implizite Umwandlung von int[]
zu object[]
und deshalb passiert es nicht.
Das einzige Mal, können Sie ein Array übergeben, die bevölkert wird, wie man es erwarten würde, wenn die Array-Typ object[]
ist, wie new object[] { 1, "hello", ... }
oder die Array-Typ ist covariant. In diesem Fall ist ein string[]
Array kovariant und kann implizit in einen object[]
umgewandelt werden, während ein int[]
nicht kann.
Zusammengefasst:
UsingParams(1, "hello")
= gut
UsingParams(new object[] { 1, "hello" })
= gut
UsingParams(new string[] { "hi", "hello" })
= gut (wegen Matrixkovarianz)
UsingParams(new int[] { 1, 2 })
= schlecht (kein Matrixkovarianz), wird ein gezacktes Array sein
Further reading on array covariance rules, die auch zitiert: "Array-Kovarianz erstreckt sich nicht speziell auf Arrays von Werttypen. Zum Beispiel gibt es keine Konvertierung, dass ein int[]
als object[]
behandelt werden erlaubt.“
Das ist kein multidimensionales Array. – Servy
Ich denke vielleicht in Bezug auf PHP - erleuchte mich? – johnjk07
@Servy ist korrekt. Es ist eigentlich ein Array, das ein anderes Array als erstes Element hat. – artokai