public void Foo(params string[] values)
{
}
E 'possibile che values
può mai essere null
, o intende essere sempre impostato con 0
o più articoli?C# - È possibile avere parametri null?
public void Foo(params string[] values)
{
}
E 'possibile che values
può mai essere null
, o intende essere sempre impostato con 0
o più articoli?C# - È possibile avere parametri null?
Assolutamente - si può chiamare con un argomento di tipo string [] con un valore null:
string[] array = null;
Foo(array);
@Schroedingers, non sei corretto. Passare null al posto di una matrice params creerà un array di riferimento null. Una matrice di lunghezza zero verrebbe creata solo se si inoltra esplicitamente uno in * o * ometti argomenti nella chiamata al metodo. Un array di un singolo elemento nullo dovrebbe essere creato esplicitamente. –
@Schroedingers, Jon e Anthony hanno ragione. Vedi la [demo] (http://ideone.com/xhpdI). Se si passa un riferimento di matrice (che include il normale letterale 'null'),' values' sarà esattamente questo. D'altra parte, se passi un riferimento a * string * che è null, sarà una matrice di lunghezza 1 come hai detto tu. –
@Jon: Avevo l'impressione (forte) che l'OP stesse chiedendo cosa è successo nel caso di 'Foo()'. Puoi controllare il mio ragionamento nella mia risposta ora cancellata nel caso tu sia interessato :) – sehe
Oltre alla risposta di Jon, si può anche avere qualcosa di simile:
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);
Ho deciso di scrivere del codice per testarlo da solo. Utilizzando il seguente programma:
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.
}
}
}
I seguenti risultati sono cedute:
strings is null.
strings is not null.
strings is null.
strings is not null.
-------
ints is null.
ints is not null.
ints is null.
Quindi sì, è del tutto possibile che la matrice associata params essere nullo.
La mia prima ipotesi è stata dichiarare il parametro con valore predefinito null, il che avrebbe avuto senso in alcuni casi, ma il linguaggio C# non lo consente.
static void Test(params object[] values = null) // does not compile
{
}
errore CS1751: Impossibile specificare un valore predefinito per una matrice di parametri
Il modo per aggirare questa limitazione passando esplicitamente null è stato già risposto.
Bene, non so come si possa passare null a quella funzione e assegnarla ai valori. Immagino di chiederti "è possibile farlo?" – michael
'Foo (null)' potrebbe valere la pena provare. –
"Provalo" non dà quasi mai una risposta definitiva. Un metodo 'params' può essere chiamato in diversi modi, rendendo questa una domanda valida. –