Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可选参数混淆_C#_.net_C# 4.0 - Fatal编程技术网

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);