C#为所有可选参数提供值

Cha*_*bos 3 .net c# optional-parameters

我正在读一本关于C#的书,我在命名和可选参数的章节中.我读过一个子弹,上面写着:

"如果存在多个可选参数且为1指定了值,则还必须为所有前面的可选参数提供值"

能不能给我一个例子,因为我无法从代码中重现上述陈述.

pyr*_*lus 10

以此方法签名为例:

public void MyMethod(object arg1, string arg2 = null, int? arg3 = null, MyType arg4 = null)
{
  // do stuff
}
Run Code Online (Sandbox Code Playgroud)

你不能调用这个方法,只提供arg1和的值arg3,如:

MyMethod(obj, 5);
Run Code Online (Sandbox Code Playgroud)

你也必须在两者之间填写论据.原因是编译器不知道你的意思是第三个参数.所以它实际上会尝试将值放在第一个可选参数中,即a string.第三个参数不是字符串而是可以为空int,因此会出现编译错误.

但是,从C#4开始,您还可以:

MyMethod(obj, arg3: 5);
Run Code Online (Sandbox Code Playgroud)

这些被称为命名参数.有关更多信息,请参阅此MSDN文章.在这种情况下,编译器仍然可以确保类型安全,因为它知道您为哪个参数提供值.

编辑:正如其他人所指出的,方法声明中参数的顺序也很重要.所有可选参数必须在最后.然而,这不是问题的实际问题.问题陈述"指定值",并在调用方法时执行此操作.


Hja*_*r Z 5

它只是意味着可选参数必须全部位于参数列表的最后。

public void Method(int param1, int param2 = 0, int param3 = 0)
{
    //This works
}
Run Code Online (Sandbox Code Playgroud)

相对

public void Method(int param1 = 0, int param2 = 0, int param3) //Param3 isn't optional.
{
    //This does not!
}

public void Method(int param1 = 0, int param2, int param3 = 0) //Param2 isn't optional.
{
    //Neither does this!
}
Run Code Online (Sandbox Code Playgroud)