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

And*_*ndy 8 c# parameters overloading

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

  1. public void RequirePermissions(params string[] permissions)...
    
    Run Code Online (Sandbox Code Playgroud)
  2. public void RequirePermissions(string message, params string[] permissions)...
    
    Run Code Online (Sandbox Code Playgroud)

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

RequirePermissions("Permission1", "Permission2");
Run Code Online (Sandbox Code Playgroud)

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

RequirePermissions(new string[] { "Permission1", "Permission2" });
Run Code Online (Sandbox Code Playgroud)

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

sco*_*ttm 8

同意亚当,我会改变它:

public void RequirePermissions(params string[] permissions)

public void RequirePermissionsWithMessage(string message, params string[] permissions)
Run Code Online (Sandbox Code Playgroud)


Mus*_*sis 8

就个人而言,我这样做:

  1. public void RequirePermissions(params string[] permissions)...
    
    Run Code Online (Sandbox Code Playgroud)
  2. public void RequireMessageAndPermissions(string message, 
        params string[] permissions)...
    
    Run Code Online (Sandbox Code Playgroud)

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


Ada*_*ght 2

是的,我同意,当使用可变长度参数数组导致模棱两可的过载时,这可能应该是一个警告 - 这很大程度上是一种边缘情况,人们几乎肯定不想创造这种情况。

除了您发布的方法之外,我也不知道有什么方法可以避免发生呼叫解析 - 除了首先避免这样做,我强烈推荐!