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

C#提供所有可选参数的值,c#,.net,optional-parameters,C#,.net,Optional Parameters,我正在读一本C#的书,在命名和可选参数一章中。我读过一个子弹,上面写着: “如果存在多个可选参数,并且为其指定了一个值 第一,前面的所有可选参数也必须是“值” 您能给我举个例子吗,因为我无法从代码中复制上述语句。这仅仅意味着可选参数必须全部位于参数列表的最后一位 public void Method(int param1, int param2 = 0, int param3 = 0) { //This works } 对 public void Method(int param1 =

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

“如果存在多个可选参数,并且为其指定了一个值 第一,前面的所有可选参数也必须是“值”


您能给我举个例子吗,因为我无法从代码中复制上述语句。

这仅仅意味着可选参数必须全部位于参数列表的最后一位

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

这意味着您不能在两个或多个可选参数之间或之后使用普通参数

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

以该方法签名为例:

public void MyMethod(object arg1, string arg2 = null, int? arg3 = null, MyType arg4 = null)
{
  // do stuff
}
不能调用此方法,只能为
arg1
arg3
提供值,例如:

MyMethod(obj, 5);
你也必须在两者之间填入论点。原因是编译器不知道您指的是第三个参数。因此,它实际上会尝试将值放在第一个可选参数中,即
字符串
。第三个参数不是字符串,而是可为null的
int
,因此会出现编译错误

但是,由于C#4,您还可以执行以下操作:

MyMethod(obj, arg3: 5);
这些参数称为命名参数。更多信息,请参见此。在这种情况下,编译器仍然可以确保类型安全,因为它知道为哪个参数提供值


edit:正如其他人指出的,方法声明中参数的顺序也很重要。所有可选参数必须位于末尾。然而,这并不是问题真正要问的。问题是“指定值”,您可以在调用该方法时这样做。

我也可以从代码中复制该语句。问题在于传递值和第一个可选参数之间存在隐式转换。所需的行为是传递最后一个可选参数的特定值,以获得编译错误。Thanks@Charalambos哈,我本想在我的帖子中提到这一点,但我觉得这太边缘化了:P但事实上,隐式铸造可以掩盖这个问题,非常危险。始终注意可选参数的类型(注意具有相同类型的多个参数,或可能的隐式强制转换),或者在调用方法时尝试命名它们。如果我确实帮助您解决了问题,您介意将我的答案标记为您问题的可接受答案吗?@pyroculus,非常感谢你的回复。虽然你帮我解决了我的问题,但我没有足够的声誉来接受这个答案。我从来不知道:)我的坏!我很高兴这些信息帮助您找到了解决方案。也许,在将来的某个时候,你可以将答案标记为已接受。