C# 可选参数混淆
如果我有一个类似以下的方法C# 可选参数混淆,c#,.net,c#-4.0,C#,.net,C# 4.0,如果我有一个类似以下的方法 void Foo (int x, int y = 23, int z=10) { Console.WriteLine (x); } 我通过:Foo(20,30) 两个可选参数中的哪一个将得到30? 另外,如果我想将20传递给x,将30传递给z?默认情况下,参数是位置性的,先到先得,因此x取20,y取30,而z取默认值10。如果想要非位置性,则需要明确: Foo(20, z: 30); 不过,一个简单的更改会让您发现: Console.WriteLine
void Foo (int x, int y = 23, int z=10)
{
Console.WriteLine (x);
}
我通过:Foo(20,30)
两个可选参数中的哪一个将得到30?另外,如果我想将20传递给
x
,将30传递给z
?默认情况下,参数是位置性的,先到先得,因此x
取20
,y
取30
,而z
取默认值10。如果想要非位置性,则需要明确:
Foo(20, z: 30);
不过,一个简单的更改会让您发现:
Console.WriteLine ("x={0}, y={1}, z={2}", x, y, z);
它的规则是可选参数的顺序 使用
Foo(20,30),
y将得到30
要通过20到x和30到z,您必须执行foo(20,z:30)代码>“函数…可以通过发送参数…按位置,按照函数定义的顺序,以标准方式调用。”
命名参数可以跟在位置参数后面…但是,位置参数不能跟在命名参数后面
因此,由于您没有指定任何命名参数,Foo(20,30)将完全按位置解释为x和y。z将保留为默认值10
如果要指定z而不是y,则可以这样调用:
Foo(10, z: 30)
或
或
它们都做同样的事情。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,z:30)
,编译器将其转换为调用Foo(20,23,30)
(第二个参数采用默认值).为什么不试试看呢?:)你为什么不自己试试呢?我试过了,我通过Foo(10,20)得到10,20,10;但是如果我想把最后一个参数传给20怎么办?@Arbaaz:你可以使用命名参数,比如Foo(10,z:20),所以我只需要提到参数的名称就可以了?凉的谢谢
Foo(z: 30, x: 10)
/// <summary>
/// </summary>
/// <param name="y">Y parameter. Can be 0. Default value: 23</param>
void Foo(int x, int y = 23, int z = 10)
const int IGNORED = 0;
...
Foo(20, IGNORED, 30);