可选参数混淆

时间:2014-01-06 09:40:27

标签: c# .net c#-4.0

如果我有类似以下的方法..

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

我通过了:Foo(20,30) 2 可选参数中的哪一个将获得30?
另外,如果我想将20传递给x并将30传递给z

,该怎么办?

4 个答案:

答案 0 :(得分:5)

默认情况下,参数是排名第一的,因此x需要20y需要30z需要默认值为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)(第二个参数采用默认值)。