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

时间:2009-09-25 20:15:43

标签: c# parameters overloading

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

  1. public void RequirePermissions(params string[] permissions)...
    
  2. public void RequirePermissions(string message, params string[] permissions)...
    
  3. 在我的代码中,我试图像第一个那样调用第一个:

    RequirePermissions("Permission1", "Permission2");
    

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

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

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

5 个答案:

答案 0 :(得分:7)

同意亚当,我会将其改为:

public void RequirePermissions(params string[] permissions)

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

答案 1 :(得分:7)

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

  1. public void RequirePermissions(params string[] permissions)...
    
  2. public void RequireMessageAndPermissions(string message, 
        params string[] permissions)...
    
  3. 人们有时会爱上超载,当你把它与对params关键字的热爱结合起来时,你只会增加最终必须接管你的代码的混淆程度。

答案 2 :(得分: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节)。

  

只有方法的正常形式不可用时,方法的扩展形式才可用   仅当与扩展表格具有相同签名的方法尚未实施时才适用   以相同类型声明

答案 3 :(得分:2)

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

除了您发布的内容之外,我也不知道为了避免发生的呼叫解决方案 - 除了避免首先进行呼叫解决之外,我强烈建议您这样做!

答案 4 :(得分:0)

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

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