代码之家  ›  专栏  ›  技术社区  ›  thebenman

具有可选参数的版本控制问题

  •  1
  • thebenman  · 技术社区  · 6 年前

    我在看一本书 article

    在这里解释一下。

    我们有一个类,其中一个方法具有以下签名。

       // v1
       public static void Redirect(string url, string protocol = "http");
    

    参数、必需的字符串url和可选的字符串协议。

     HttpHelpers.Redirect("https://haacked.com/");
     HttpHelpers.Redirect(url: "https://haacked.com/");
     HttpHelpers.Redirect("https://haacked.com/", "https");
     HttpHelpers.Redirect("https://haacked.com/", protocol: "https");
     HttpHelpers.Redirect(url: "https://haacked.com/", protocol: https");
     HttpHelpers.Redirect(protocol: "https", url: https://haacked.com/");
    

    请注意,无论参数是否可选,您都可以选择 是否按名称引用参数。在最后一种情况下,请注意 参数的指定顺序不对。在本例中,使用命名 参数是必需的。

    下一个版本

    减少API的重载数量。然而,依靠 可选参数确实有其特殊之处,您需要在

    假设我们已经准备好制作第二版了 HttpHelpers库,我们向现有的 方法。

     // v2
     public static void Redirect(string url, string protocol = "http",   bool permanent = false);
    

    当我们尝试执行客户机而不重新编译 客户端应用程序?

    我们得到以下异常消息。

          Unhandled Exception: System.MissingMethodException: Method not found: 'Void HttpLib.HttpHelpers.Redirect(System.String,
      System.String)'....
    

    我不明白为什么这个更改会破坏部署而不是重新编译的更改。

    在更改了包含可选参数的方法签名之后,它应该仍然可以工作吗?即使我们不重新编译客户端应用程序,因为这是一个可选参数。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Selman Genç    6 年前

    您的代码需要重新编译,以便编译器可以生成对采用三个参数的新方法的调用。可选方法只是语法糖,当您不提供可选参数时,编译器会为您传递默认值。但如果您不重新编译代码,并且在需要三个参数时尝试使用两个参数调用方法,则不会发生这种情况。