Ответ 1
Раздел 7.4.1 Спецификации языка С# (см.: С# 3.0 spec)
В частности, обратите внимание, что пустой массив создается, когда для массива параметров задано ноль аргументов.
Это последняя строка раздела
Спецификация С#. позволяет вам вызвать функцию
void foo(params int[] x)
с нулевыми параметрами. Однако я не нашел в С# Lang. Спекуляция слово о дальнейшем поведении - будет ли foo пустым массивом или нулевой ссылкой? Я также проверил MSDN - ничего.
Где определено поведение?
ПРИМЕЧАНИЕ: я не спрашиваю, как ведет себя VS, я спрашиваю о дизайне языка.
Раздел 7.4.1 Спецификации языка С# (см.: С# 3.0 spec)
В частности, обратите внимание, что пустой массив создается, когда для массива параметров задано ноль аргументов.
Это последняя строка раздела
17.5.1.4 Массивы параметров
Массив параметров разрешает указывать одним из двух способов в вызов метода:
• Аргумент заданный для массива параметров, может быть единственное выражение типа, которое неявно конвертируемый (§13.1) в тип массива параметров. В этом случае, массив параметров действует точно как параметр значения.
• В качестве альтернативы, вызов может укажите ноль или более аргументов для массив параметров, где каждый аргумент является выражением типа, который является неявно конвертируемый (§13.1) в тип элемента массива параметров. В этом случае вызов создает экземпляр массива параметров тип с длиной, соответствующей количество аргументов, инициализирует элементы экземпляра массива с заданными значениями аргументов и использует вновь созданный экземпляр массива как фактический аргумент.
В этом же разделе приведен пример:
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();
}
}
выводит вывод
Array contains 3 elements: 1 2 3 Array
contains 4 elements: 10 20 30 40 Array
contains 0 elements:
Этот пример иллюстрирует ожидаемое поведение: пустой массив
Для вызываемого абонента он равен void foo(int[] x)
, а параметры n
передают вам массив с элементами n
. Таким образом, нулевые параметры будут переведены в int [0].