2013-12-25 3 views
-10

Предположим, я определить метод, как это:Почему этот код компилируется?

public static void ListInts(int[] inVals) 
{ 
    for (int i = 0; i < inVals.Length; i++) 
    { 
     Console.WriteLine("{0}", inVals[i]); 
    } 
} 

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

ListInts(); 

ListInts метод» 'имеет один параметр (ы), но вызывается с 0 аргументами

Но когда я изменяю определение метода следующим образом:

public static void ListInts(params int[] inVals) 
{ 
    for (int i = 0; i < inVals.Length; i++) 
    { 
     Console.WriteLine("{0}", inVals[i]); 
    } 
} 

Ошибка. Мне любопытно, почему это происходит? И почему второй код компилируется без каких-либо ошибок? Что происходит за кулисами, когда мы используем ключевое слово params?

+2

Первый Google ударил: http://msdn.microsoft.com/en-us/library/w5zay9db.aspx. –

+1

Что вы ожидали? Какой эффект вы ожидали бы от ключевого слова 'params'? –

+1

Знаете ли вы, что именно «params» делает? –

ответ

4

Вы можете легко найти причину в документации.

От MSDN:

Используя параметры ключевых слов, вы можете указать параметр метода, который принимает переменное число аргументов. Вы можете отправить список аргументов типа, указанного в объявлении параметра, или массив аргументов указанного типа. Вы также можете отправить никаких аргументов. Если вы не отправляете никаких аргументов, длина списка параметров равна нулю. Дополнительные параметры не разрешены после ключевого слова params в объявлении метода, и только одно ключевое слово params разрешено в объявлении метода.

3

Ключевое слово params выполняет функцию в variadic function. Вариадические функции могут принимать от 0 до (теоретически) бесконечные аргументы. Вот почему ваш код компилируется. Функция string.Format является классическим примером вариационной функции.

Если вы хотите создать VARIADIC функцию, которая должна принимать, по меньшей мере, один параметр, вы можете сделать следующее (в C#):

int methodname(int arg1, param int[] restOfArgs) {} 

В какой момент вы будете вынуждены дать по крайней мере один аргумент функции

2

MSDN ссылка

http://msdn.microsoft.com/en-us/library/w5zay9db.aspx

по USI ng ключевое слово params, вы можете указать параметр метода, который принимает переменное количество аргументов. Вы можете отправить список аргументов с запятой типа, указанного в объявлении параметра , или массивом аргументов указанного типа. Вы также можете отправить аргументы . Если вы не отправляете никаких аргументов, длина списка параметров равна zero.No дополнительные параметры не разрешены после ключевого слова params в объявлении метода, и только одно ключевое слово params разрешено в объявлении метода .

+1

Это ваши слова или вы скопировали их со страницы [MSDN] (http://msdn.microsoft.com/cs-cz/library/w5zay9db.aspx)? ':)' –

+0

Скопировано из MSDN. – john

+0

@ SonerGönül Обернутый текст в блочные кавычки (@sonu, FYI), пожалуйста, пересмотреть, если вы отклонили ответ. –

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

  • Нет связанных вопросов^_^