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

Возможно ли, что values никогда не может быть null, или он всегда будет иметь значение с 0 или больше деталей?C# - Возможно ли иметь нулевые параметры?

+2

Ну, я не знаю, как вы можете передать значение null этой функции и присвоить ей значения. Наверное, я спрашиваю: «Можно ли это сделать?» – michael

+3

'Foo (null)' Возможно, стоит попробовать. –

+11

«Попробуй» почти никогда не дает окончательного ответа. Метод 'params' может быть вызван несколькими способами, что делает его правильным. –

ответ

57

Абсолютно - Вы можете назвать это с аргументом типа строки [] со значением нуль:

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

@Schroedingers, вы ошибаетесь. Передача null вместо массива params создаст нулевой ссылочный массив. Массив нулевой длины будет создан только в том случае, если вы явно передали один из аргументов * или * без аргументов в вызове метода целиком. Массив одного нулевого элемента должен быть явно создан. –

+0

@ Шотландцы, Джон и Энтони правы. См. [Demo] (http://ideone.com/xhpdI). Если вы передадите ссылку на массив (в которую входит обычный «нулевой» литерал), «значения» будут именно такими. С другой стороны, если вы передаете ссылку * string *, которая имеет значение null, это будет массив длиной 1, как вы сказали. –

+0

@ Jon: Я был под сильным впечатлением, что OP спрашивал о том, что произошло в случае с Foo(). Вы можете проверить мои рассуждения в моем теперь удаленном ответе, если вам интересно :) – sehe

3

В дополнение к ответу Джона, вы также можете иметь что-то вроде этого:

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

Я решил написать код, чтобы проверить это для себя. Используя следующую программу:

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. 
     } 
    } 
} 

являются были получены следующие результаты:

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

Так что да, это вполне возможно, для массива, связанного с Params быть нулевым.

4

Мое первое предположение заключалось в объявлении параметра со значением по умолчанию null, что имеет смысл в некоторых случаях, но язык C# не позволяет этого.

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

ошибка CS1751: Не удается задать значение по умолчанию для параметра массива

Способ обойти это ограничение, явно проходя нуль уже ответил.

Смежные вопросы