【问题标题】:C# supply values for all optional parametersC# 为所有可选参数提供值
【发布时间】:2015-04-14 11:53:15
【问题描述】:

我正在阅读一本 C# 书籍,我正在阅读命名参数和可选参数的章节。我读过一个项目符号,上面写着:

"如果存在多个可选参数并且为 一,所有前面的可选参数也必须提供值”

您能否举个例子,因为我无法从代码中重现上述语句。

【问题讨论】:

  • 如果我确实帮助您解决了您的问题,您介意将我的答案标记为您问题的已接受答案吗?
  • @pyrocumulus,非常感谢您的回复。尽管您帮助我解决了我的问题,但我没有足够的声誉来接受答案。
  • 我从来不知道 :) 我的错!我很高兴这些信息可以帮助您解决问题。也许,在未来的某个时候,您可以将答案标记为已接受。

标签: c# .net optional-parameters


【解决方案1】:

以这个方法签名为例:

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。在这种情况下,编译器仍然可以确保类型安全,因为它知道您为哪个参数提供值。

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

【讨论】:

  • 我也能够从我的代码中复制该语句。问题是在传递值和第一个可选参数之间存在隐式转换。期望的行为是传递最后一个可选参数的特定值以获得编译错误。谢谢
  • @Charalambos Ha,我曾想过在我的帖子中提到这一点,但认为这太过分了:P 但实际上,隐式转换可以掩盖这个问题,足够危险。始终注意可选参数的类型(注意具有相同类型的多个参数,或可能的隐式转换),或者在调用方法时尝试命名它们。
【解决方案2】:

这只是意味着可选参数必须全部在参数列表中。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-03
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多