如果我有类似以下的方法..
void Foo (int x, int y = 23, int z=10)
{
Console.WriteLine (x);
}
我通过了:Foo(20,30)
2 可选参数中的哪一个将获得30?
另外,如果我想将20传递给x
并将30传递给z
?
答案 0 :(得分:5)
默认情况下,参数是排名第一的,因此x
需要20
,y
需要30
,z
需要默认值为10.如果您想要非位置,则需要明确:
Foo(20, z: 30);
一个简单的改变可以让你找到答案:
Console.WriteLine ("x={0}, y={1}, z={2}", x, y, z);
答案 1 :(得分:2)
“一个函数......可以通过发送参数...按位置,按函数定义的顺序以标准方式调用。”
“命名参数可以跟随位置参数......但是,位置参数不能跟随命名参数。”
Named and Optional Arguments (C# Programming Guide)
因为你没有指定任何命名参数,所以Foo(20,30)将完全按位置解释为x和y。 z将保留为默认值10。
如果你想指定z而不是y,你可以这样调用:
Foo(10, z: 30)
或
Foo(x: 10, z: 30)
或
Foo(z: 30, x: 10)
这些都做同样的事情。
答案 2 :(得分:1)
这是规则的可选参数的顺序。
Foo(20, 30),
y将获得30。
要将20传递给x和30传递给z,您必须执行foo(20, z: 30);
答案 3 :(得分: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)
(第二个参数采用默认值)。