2011-07-05 13 views
36
public void Foo(params string[] values) 
{ 
} 

¿Es posible que values de que pueda haber null, o ¿Siempre será fijado con 0 o más artículos?C# - ¿Es posible tener params nulos?

+2

Bueno, no sé cómo se puede pasar de cero a esa función y hacer que le asigne a los valores. Supongo que estoy preguntando "¿es posible hacer eso?" – michael

+3

'Foo (null)' podría valer la pena intentarlo. –

+11

"Pruébelo" casi nunca da una respuesta definitiva. Un método 'params' se puede invocar de varias maneras, lo que lo convierte en una pregunta válida. –

Respuesta

57

Absolutamente - se le puede llamar con un argumento de tipo string [] con un valor de nulo:

string[] array = null; 
Foo(array); 
+1

@Schroedingers, usted es incorrecto. Pasar nulo en lugar de una matriz de params creará una matriz de referencia nula. Se creará una matriz de longitud cero solo si expide explícitamente uno en * o * omite argumentos en la llamada al método por completo. Una matriz de un solo elemento nulo tendría que crearse explícitamente. –

+0

@Schroedingers, Jon y Anthony tienen razón. Vea la [demostración] (http://ideone.com/xhpdI). Si pasa una referencia de matriz (que incluye el literal 'null' normal),' values' será exactamente eso. Por otro lado, si pasa una referencia * string * que pasa a ser nula, será una matriz de longitud 1 como usted dijo. –

+0

@Jon: Estaba bajo la (fuerte) impresión de que OP estaba preguntando qué pasó en el caso de 'Foo()'. Puede comprobar mi razonamiento en mi respuesta ahora suprimido en caso de que esté interesado :) – sehe

3

Además de la respuesta de Jon, también puede tener algo como esto:

string[] array1 = new string[]; //array is not null, but empty 
Foo(array1); 
string[] array2 = new string[] {null, null}; //array has two items: 2 null strings 
Foo(array2); 
24

Decidí escribir un código para probarlo por mí mismo. Utilizando el siguiente programa:

using System; 

namespace TestParams 
{ 
    class Program 
    { 
     static void TestParamsStrings(params string[] strings) 
     { 
      if(strings == null) 
      { 
       Console.WriteLine("strings is null."); 
      } 
      else 
      { 
       Console.WriteLine("strings is not null."); 
      } 
     } 

     static void TestParamsInts(params int[] ints) 
     { 
      if (ints == null) 
      { 
       Console.WriteLine("ints is null."); 
      } 
      else 
      { 
       Console.WriteLine("ints is not null."); 
      } 
     } 

     static void Main(string[] args) 
     { 
      string[] stringArray = null; 

      TestParamsStrings(stringArray); 
      TestParamsStrings(); 
      TestParamsStrings(null); 
      TestParamsStrings(null, null); 

      Console.WriteLine("-------"); 

      int[] intArray = null; 

      TestParamsInts(intArray); 
      TestParamsInts(); 
      TestParamsInts(null); 
      //TestParamsInts(null, null); -- Does not compile. 
     } 
    } 
} 

se arrojó los siguientes resultados:

strings is null. 
strings is not null. 
strings is null. 
strings is not null. 
------- 
ints is null. 
ints is not null. 
ints is null. 

Así que sí, es perfectamente posible que la matriz asociada a params a ser nulo.

4

Mi primera suposición fue declarar el parámetro con el valor predeterminado de null, lo cual tendría sentido, en algunos casos, pero el lenguaje C# no permite esto.

static void Test(params object[] values = null) // does not compile 
{ 
} 

error CS1751: No se puede especificar un valor predeterminado para una matriz de parámetros

La manera de conseguir alrededor de esta limitación pasando explícitamente nula ya fue respondida.

Cuestiones relacionadas