2010-05-31 10 views
15

C# spez. können Sie eine Funktion aufrufenNull Argumente als Parameter übergeben - wo ist das Verhalten definiert?

void foo(params int[] x) 

mit Null-Parameter. Allerdings habe ich in C# Lang nicht gefunden. Spez. ein Wort über weiteres Verhalten - wird foo ein leeres Array oder eine Nullreferenz erhalten? Ich habe auch MSDN überprüft - nichts.

Wo ist das Verhalten definiert?

HINWEIS: Ich frage nicht, wie VS verhält, frage ich über das Design der Sprache.

Antwort

21

Abschnitt 7.4.1 von die C# -Sprachspezifikation

Beachten Sie, dass ein leeres Array erstellt wird, wenn für das Array null Argumente angegeben sind.

Es ist buchstäblich die letzte Zeile des Abschnitts (C# 3.0 spec)

+0

MS auch diese Information verbergen, ich den params Abschnitt geprüft ;-) Vielen Dank. – greenoldman

+0

Eine Problemumgehung für dieses Problem: Erstellen Sie eine überladene Version von Konstruktor/Methode mit Nullargumenten. Beispiel: 'void foo()' und 'void foo (params int [] x)' – kevinarpe

+0

Danke. Hier ist ein neuer Link, der auf das verweist, worauf Anthoney sich bezieht. [Argumentlisten -> Laufzeitauswertung von Argumentlisten] (https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/expressions#run-time-evaluation-of -Argument-Listen) – Darrelk

0

Für den aufgerufenen ist es gleich void foo(int[] x) und übergibt n Parameter geben Sie ein Array mit n Elemente. Also werden Null-Parameter in ein int [0] übersetzt.

13

17.5.1.4 Parameter Arrays

Ein Parameterarray Argument in einem von zwei Arten in einem Methodenaufruf ermöglicht angegeben werden:

• Das Argument für einen Parameter Array gegeben kann eine sein, einzelner Ausdruck eines Typs, der implizit konvertierbar (§13.1) in den Parameter Array-Typ ist. In diesem Fall wirkt das Parameter-Array genau wie ein Wert-Parameter .

• Alternativ kann der Aufruf angeben null oder mehr Argumente für den Parameter-Array, wobei jedes Argument Ausdruck einer Art ist, die implizit umwandelbar ist (§13.1) zum Elementtyp des Parameter-Array. In diesem Fall erzeugt der Aufruf eine Instanz des Parameterarray Typs mit einer Länge bis die Anzahl der Argumente entspricht, initialisiert die Elemente der Array-Instanz mit den Argumentwerten gegeben, und verwendet die neu erstellten Array Instanz als das eigentliche Argument.

Im gleichen Abschnitt ist ein Beispiel gegeben:

using System; 
class Test 
{ 
    static void F(params int[] args) { 
     Console.Write("Array contains {0} elements:", args.Length); 
     foreach (int i in args) 
      Console.Write(" {0}", i); 
     Console.WriteLine(); 
    } 

    static void Main() { 
     int[] arr = {1, 2, 3}; 
     F(arr); 
     F(10, 20, 30, 40); 
     F(); 
    } 
} 

erzeugt die Ausgabe

Array contains 3 elements: 1 2 3 Array 
contains 4 elements: 10 20 30 40 Array 
contains 0 elements: 

Dieses Beispiel veranschaulicht das erwartete Verhalten: leeres Array

Verwandte Themen