public void Foo(params string[] values)
{
}
Возможно ли, что values
никогда не может быть null
, или он всегда будет иметь значение с 0
или больше деталей?C# - Возможно ли иметь нулевые параметры?
public void Foo(params string[] values)
{
}
Возможно ли, что values
никогда не может быть null
, или он всегда будет иметь значение с 0
или больше деталей?C# - Возможно ли иметь нулевые параметры?
Абсолютно - Вы можете назвать это с аргументом типа строки [] со значением нуль:
string[] array = null;
Foo(array);
@Schroedingers, вы ошибаетесь. Передача null вместо массива params создаст нулевой ссылочный массив. Массив нулевой длины будет создан только в том случае, если вы явно передали один из аргументов * или * без аргументов в вызове метода целиком. Массив одного нулевого элемента должен быть явно создан. –
@ Шотландцы, Джон и Энтони правы. См. [Demo] (http://ideone.com/xhpdI). Если вы передадите ссылку на массив (в которую входит обычный «нулевой» литерал), «значения» будут именно такими. С другой стороны, если вы передаете ссылку * string *, которая имеет значение null, это будет массив длиной 1, как вы сказали. –
@ Jon: Я был под сильным впечатлением, что OP спрашивал о том, что произошло в случае с Foo(). Вы можете проверить мои рассуждения в моем теперь удаленном ответе, если вам интересно :) – sehe
В дополнение к ответу Джона, вы также можете иметь что-то вроде этого:
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);
Я решил написать код, чтобы проверить это для себя. Используя следующую программу:
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 быть нулевым.
Мое первое предположение заключалось в объявлении параметра со значением по умолчанию null, что имеет смысл в некоторых случаях, но язык C# не позволяет этого.
static void Test(params object[] values = null) // does not compile
{
}
ошибка CS1751: Не удается задать значение по умолчанию для параметра массива
Способ обойти это ограничение, явно проходя нуль уже ответил.
Ну, я не знаю, как вы можете передать значение null этой функции и присвоить ей значения. Наверное, я спрашиваю: «Можно ли это сделать?» – michael
'Foo (null)' Возможно, стоит попробовать. –
«Попробуй» почти никогда не дает окончательного ответа. Метод 'params' может быть вызван несколькими способами, что делает его правильным. –