2014-01-06 6 views
0

Если у меня есть способ что-то вроде следующего ..Необязательный параметр спутанность

void Foo (int x, int y = 23, int z=10) 
{ 
    Console.WriteLine (x); 
} 

И я прохожу: Foo(20,30) , какой из 2 дополнительных параметров получит 30?
Кроме того, что, если я хочу передать 20 до x и от 30 до z?

+4

Почему бы не попробовать и не посмотреть? :) – Kjartan

+2

Почему бы вам не попробовать себя? –

+0

http://msdn.microsoft.com/en-us/library/dd264739.aspx – Priyank

ответ

5

По умолчанию параметры позиционных и первым пришел первым обслужен, поэтому x принимает 20, y принимает 30 и z принимает значение по умолчанию 10. Если вы хотите не-позиционные, вы должны быть четко:

Foo(20, z: 30); 

простое изменение позволит вам узнать, хотя:

Console.WriteLine ("x={0}, y={1}, z={2}", x, y, z); 
+0

Так что все, что мне нужно сделать, это указать имя параметра? круто. благодаря – Arbaaz

1

Это порядок необязательных параметров, что правила.

С Foo(20, 30), у получит 30.

Чтобы пройти от 20 до й и от 30 до г, вам придется сделать foo(20, z: 30);

2

«функции ... можно назвать стандартным способом, отправив аргументы ... по положению в порядке, определенном функцией. "

«Именованный аргумент может следовать позиционным аргументам ... Однако позиционный аргумент не может следовать за именованным аргументом».

Named and Optional Arguments (C# Programming Guide)

Так как вы не указали никаких именованных аргументов, Foo (20, 30) будет интерпретироваться полностью позиционно, а х и у. г останется по умолчанию 10.

Если вы хотите задать г, а не у, вы бы ссылаться, как так:

Foo(10, z: 30) 

или

Foo(x: 10, z: 30) 

или

Foo(z: 30, x: 10) 

Все они делают то же самое.

0

Foo(20, 30) равен Foo(20, 30, 10) (значение по умолчанию добавляется в вызов компилятором). Если вы хотите указать третий, но не хотите указывать второй параметр, вам все равно нужно указать какое-то значение на вызов функции Foo(20, ..., 30).В основном, в таких случаях, специальные значения определены для второго параметра, что-то вроде

/// <summary> 
    /// </summary> 
    /// <param name="y">Y parameter. Can be 0. Default value: 23</param> 
    void Foo(int x, int y = 23, int z = 10) 

так, что вы будете называть его Foo(20, 0, 30) или, если существует константа определена, более четко:

const int IGNORED = 0; 
... 
Foo(20, IGNORED, 30); 

Однако было бы неплохо предоставить не специальное, а значение по умолчанию, и здесь вы можете полностью опустить необязательные параметры (как указывают другие ответы): Foo(20, z: 30), который будет преобразован компилятором в звонок Foo(20, 23, 30) (значение по умолчанию взято для второго параметра).

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