2010-05-31 17 views
15

C# spec. vous permet d'appeler une fonctionPasser des arguments zéro en tant que params - où le comportement est défini?

void foo(params int[] x) 

avec zéro paramètre. Cependant, je n'ai pas trouvé en C# Lang. Spec. un mot sur le comportement ultérieur - aura-t-il un tableau vide ou une référence nulle? J'ai également vérifié MSDN - rien.

Où le comportement est défini?

NOTE: Je ne demande pas comment VS se comporte, je pose des questions sur la conception de la langue.

Répondre

21

Section 7.4.1 la spécification de langage C#

En particulier, notez qu'un tableau vide est créé lorsqu'il y a zéro arguments donnés pour le paramètre tableau.

Il est littéralement la dernière ligne de la section (C# 3.0 spec)

+0

MS cacher bien cette information, j'ai vérifié la section params ;-) Merci beaucoup. – greenoldman

+0

Solution de contournement pour ce problème: Créez une version surchargée de constructeur/méthode avec zéro argument. Ex: 'void foo()' et 'void foo (params int [] x)' – kevinarpe

+0

Merci. Voici un nouveau lien qui indiquera ce à quoi Anthoney fait référence. [Listes d'arguments -> Exécution de l'évaluation des listes d'arguments] (https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/expressions#run-time-evaluation-of -argument-lists) – Darrelk

0

Pour l'appelé, il est égal à void foo(int[] x) et en passant n paramètres vous donnera un tableau avec n éléments. Donc, les paramètres zéro seront traduits en int [0].

13

17.5.1.4 tableaux de paramètres

un tableau de paramètres autorise arguments à être spécifié dans l'une de deux façons dans une invocation de méthode :

• L'argument donné pour un ensemble de paramètres peut être un expression unique d'un type implicitement convertible (§13.1) au type de tableau de paramètres . Dans ce cas, le tableau de paramètres agit précisément comme un paramètre de valeur.

• En variante, l'invocation peut spécifier zéro ou plusieurs arguments pour le tableau de paramètres , où chaque argument est une expression d'un type qui est implicitement convertible (§13.1) pour le type d'élément du tableau de paramètres. Dans ce cas, l'invocation crée une instance du type tableau de paramètres avec une longueur correspondant à le nombre d'arguments, initialise les éléments de l'instance de tableau avec les valeurs des arguments donnés et utilise la nouvelle matrice instance comme argument réel.

Dans la même section donne un exemple:

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(); 
    } 
} 

produit la sortie

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

Cet exemple illustre le comportement attendu: tableau vide