【问题标题】:C# params keyword with two parameters of the same type具有相同类型的两个参数的 C# params 关键字
【发布时间】:2009-09-25 20:15:42
【问题描述】:

我今天在 C# 中遇到了一些我以前没有想到的东西。我的班级有两种方法,一种是另一种的重载。它们是这样声明的:

  1. public void RequirePermissions(params string[] permissions)...
    
  2. public void RequirePermissions(string message, params string[] permissions)...
    

在我的代码中,我尝试这样调用第一个:

RequirePermissions("Permission1", "Permission2");

...期待它调用第一个重载。好吧,它称为第二次重载。在这种情况下,我可以让它调用第一个方法的唯一方法是手动传递一个 string[] 对象,如下所示:

RequirePermissions(new string[] { "Permission1", "Permission2" });

现在,这种行为不会让我感到困惑,因为我知道编译器无法根据我提供的参数来判断我实际想要调用的方法。但是如果我不小心,这可能在我的代码中被忽视了。似乎微软应该让编译器在遇到上述情况时抛出错误。有人对此有任何想法吗?除了我发布的“解决方案”之外,还有其他方法可以调用第一个重载吗?

【问题讨论】:

标签: c# parameters overloading


【解决方案1】:

同意 Adam,我会将其更改为:

public void RequirePermissions(params string[] permissions)

public void RequirePermissionsWithMessage(string message, params string[] permissions)

【讨论】:

  • 该死的,直到我发布我的答案后才注意到你的答案。我猜,代码示例中的滚动条让我眼前一亮。
【解决方案2】:

就我个人而言,我会这样做:

  1. public void RequirePermissions(params string[] permissions)...
    
  2. public void RequireMessageAndPermissions(string message, 
        params string[] permissions)...
    

人们有时会爱上重载,而当您将其与对 params 关键字的喜爱结合起来时,您只会增加最终必须接管您的代码的人的困惑程度。

【讨论】:

    【解决方案3】:

    看来没有别的办法了。

    您可以在 C# 规范 http://www.jaggersoft.com/csharp_standard /17.5.1.4.htm 和此处 http://www.jaggersoft.com/csharp_standard/14.4.2.1.htm(第 2 段)中找到对此行为的解释

    参数数组完全等同于相同类型的值参数(第 17.5.1.1 节)。

    方法的扩展形式只有在方法的正常形式不可用时才可用 适用且仅当与扩展表单具有相同签名的方法尚未存在时 在同一类型中声明

    【讨论】:

      【解决方案4】:

      是的,我同意当使用可变长度参数数组导致模棱两可的重载时,这可能是一个警告 - 这是非常极端的情况,人们几乎肯定不会故意制造这种情况。

      除了您发布的内容之外,我也不知道有什么方法可以避免发生的呼叫解决 - 除了一开始就避免这样做,我强烈推荐!

      【讨论】:

        【解决方案5】:

        你不能使用参数和明确的签名。

        public void RequirePermissions(string[] permissions)...
        public void RequirePermissions(string message, string[] permissions)..
        

        【讨论】:

          猜你喜欢
          • 2020-11-26
          • 2011-10-15
          • 2022-08-18
          • 1970-01-01
          • 2019-04-15
          • 2014-11-10
          • 1970-01-01
          • 1970-01-01
          • 2014-08-19
          相关资源
          最近更新 更多