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

我正在读一本关于C#的书,我在命名和可选参数的章节中。 我读了一个子弹说:

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

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

以此方法签名为例:

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

您无法调用此方法,只能为arg1arg3提供值,例如:

 MyMethod(obj, 5); 

你也必须填写其间的参数。 原因是编译器不知道你的意思是第三个参数。 所以它实际上会尝试将值放在第一个可选参数中,作为一个string 。 第三个参数不是字符串而是可以为null的int ,因此您会收到编译错误。

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

 MyMethod(obj, arg3: 5); 

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

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

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

 public void Method(int param1, int param2 = 0, int param3 = 0) { //This works } 

 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! } 

这意味着您不能在2个或更多可选参数之间或之后具有正常参数

 void MyMethod(int param1, int param2, int optparam3 = 5, int param4) 

我显示的示例无效(遵循声明所示),可选参数必须始终是最后一个。

其次你的问题可能意味着如果方法存在多个可选参数,那么如果你决定提供1,你必须提供所有这些参数。从.net4.0开始,这个语句也是假的。 我无法分辨旧的.net版本,因为我几乎从不使用可选项,但如果您有3个可选参数,则只能根据需要设置第二个参数。

它们意味着如果你只需要选项#2,你必须填写可选#1和可选#3,这是不正确的。 您可以在方法的调用中使用以下格式指定一个或多个可选项,并跳转您不想要的任何参数:

 MyMethods(param1,param2,optional6 : 225, optional9 : "a string");