Передача нулевых аргументов в качестве параметров - где определяется поведение?

Спецификация С#. позволяет вам вызвать функцию

void foo(params int[] x)

с нулевыми параметрами. Однако я не нашел в С# Lang. Спекуляция слово о дальнейшем поведении - будет ли foo пустым массивом или нулевой ссылкой? Я также проверил MSDN - ничего.

Где определено поведение?

ПРИМЕЧАНИЕ: я не спрашиваю, как ведет себя VS, я спрашиваю о дизайне языка.

Ответы

Ответ 1

Раздел 7.4.1 Спецификации языка С# (см.: С# 3.0 spec)

В частности, обратите внимание, что пустой массив создается, когда для массива параметров задано ноль аргументов.

Это последняя строка раздела

Ответ 2

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:

Этот пример иллюстрирует ожидаемое поведение: пустой массив

Ответ 3

Для вызываемого абонента он равен void foo(int[] x), а параметры n передают вам массив с элементами n. Таким образом, нулевые параметры будут переведены в int [0].