Warum verhalten sich Params so?

22

Ausgabe

  

1

     

2

     

null

     

2

Code

%Vor%     
ChaosPandion 05.02.2010, 21:21
quelle

4 Antworten

28

Dies ist eine ziemlich häufig gestellte Frage. Einzelheiten finden Sie in Abschnitt 7.4.1 und 7.4.3.1 der Spezifikation.

Kurz gesagt: Eine Methode mit einem params-Array ist entweder in ihrer "normalen Form" oder ihrer "erweiterten Form" anwendbar. Das heißt, Sie können

sagen %Vor%

Bei einem Aufruf, der in beiden Formen anwendbar ist, wählt der Compiler immer die normale Form über die erweiterte Form.

Nehmen wir an, wir wählen die erweiterte Form jedes Mal, wenn beide anwendbar sind. Angenommen, du hättest

%Vor%

Wie würden Sie tatsächlich ein Null-Array an diese Sache übergeben, wenn wir immer die erweiterte Form wählen? Das wäre unmöglich!

Angenommen, Sie sagten

%Vor%

und wir haben immer die erweiterte Form gewählt. Was würde das tun? Nun, ein Array von Objekten ist ein Objekt, also würde dies die erweiterte Form wählen - es würde ein anderes Array machen, dieses Ding in das Array einpacken und das übergeben!

Die Wahl der erweiterten Form über die normale Form führt zu verrückten Ergebnissen. Es ist sinnvoller, immer die normale Form über die erweiterte Form zu wählen.

    
Eric Lippert 05.02.2010, 21:34
quelle
5

Es funktioniert wie geplant, würde ich sagen:

  
    

PrintLength (s);

  

Sie übergeben eine einzelne Zeichenfolge, die null ist - in Ihrer Methode ist items wird nicht ist null - es ist ein Array aus einem Element - vom Typ string - mit Wert null

  
    

PrintLength (s, s);

  

Die gleiche Geschichte hier - Sie geben zwei Elemente weiter, also ist items in Ihrer Methode ein Array aus zwei Strings - beide sind selbst null, aber das Array ist nicht

  
    

PrintLength (null);

  

Dies wird offensichtlich als einzelner NULL-Wert interpretiert und somit ist items null. Sie geben weder ein Array noch ein Element vom Typ string weiter - Sie übergeben nur einen Nullwert per se.

  
    

PrintLength (null, null);

  

Das ist wieder - ein Array von zwei Elementen, die beide null sind - aber das Array an sich ist nicht null, da Sie zwei Werte übergeben.

Es ist ein bisschen rätselhaft, vielleicht - aber wirklich: Was Sie in Ihrer PrintLength -Methode überprüfen müssen, ist nicht, ob Ihr Items als Ganzes null ist - aber ob die tatsächlichen Werte items[0] usw. sind null.

Was ein bisschen seltsam ist, ist vielleicht - oder zunächst kontraintuitiv - die Tatsache, dass der einzelne explizite "Null" -Wert als "Null" behandelt wird - und nicht als ein Array eines einzelnen Wertes. Warum das der Fall ist und ob es anders hätte umgesetzt werden können - ich weiß es nicht ganz ehrlich.

    
marc_s 05.02.2010 21:29
quelle
4

Das PrintLength(null) übergibt ein Null-Array, wobei PrintLength(null, null) ein string[] mit einer Länge von zwei mit zwei null string -Objekten übergibt. Es wäre dasselbe wie die Übergabe von new string[] { null, null }

Hmm, was ich geschrieben habe, vielleicht beantwortet das nicht deine Frage shrug .

Bearbeiten:

Dies ist vermutlich der Grund: Sie können eine durch Kommas getrennte Liste mit Argumenten des in der Parameterdeklaration angegebenen Typs oder ein Array mit Argumenten des angegebenen Typs senden.

Ссылка

    
Cory Charlton 05.02.2010 21:26
quelle
0

Wie in Antwort 1 gesagt:

  • 1: Ein Array von Strings mit einem Element - das Element ist null

  • 2: Ein Array von Strings mit zwei Elementen, beide Elemente sind null

  • null: null wird an die Methode übergeben, nicht an ein Array

  • 2: Ein Array von Nullen wird in die Methode

  • übergeben
spookycoder 05.02.2010 21:31
quelle

Tags und Links