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

时间:2015-04-14 11:53:16

标签: c# .net optional-parameters

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

  

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

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

3 个答案:

答案 0 :(得分:10)

以此方法签名为例:

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

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

MyMethod(obj, 5);

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

但是,从C#4开始,你也可以这样做:

MyMethod(obj, arg3: 5);

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

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

答案 1 :(得分:4)

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

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 :(得分:4)

这意味着您不能在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");