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

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

void foo(params int[] x)

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

Где определяется поведение?

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

Ответы [ 3 ]

26 голосов
/ 31 мая 2010

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

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

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

13 голосов
/ 31 мая 2010

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:

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

0 голосов
/ 31 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...