C#params关键字与两个相同类型的参数

我今天刚遇到C#的东西,我以前没想过。 我class上有两种方法,一种是另一种方法的重载。 它们被声明如下:

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

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

同意亚当,我会改变它:

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

就个人而言,我这样做:

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

人们有时会爱上超载,当你将它与对params关键字的热爱结合起来时,你只会增加最终必须接管你的代码的人的混乱程度。

看起来没有别的办法了。

您可以在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节)。

仅当方法的正常forms不适用且仅与已展开forms具有相同签名的方法尚未在同一类型中声明时,方法的扩展forms才可用

是的,我同意它应该是一个警告,当使用可变长度参数数组导致一个模糊的重载 – 这是一个边缘情况,人们几乎肯定不是要创建这种情况。

除了你发布的内容之外,我也不知道任何方式,以避免发生的呼叫解决 – 除了避免首先这样做,我强烈推荐!

你不能使用params并明确你的签名。

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