【问题标题】:mixing optional parameters and params keyword in c# [duplicate]在c#中混合可选参数和params关键字[重复]
【发布时间】:2013-02-13 10:17:23
【问题描述】:

我正在尝试混合可选参数和可变长度参数(使用 params 关键字):

这是函数声明:

void foo(int req, string opt = "empty", params object[] rest) {}

下面是对该函数的调用:

foo(1);
foo(1, "something");
foo(1, "something", 2, 3);
foo(1, 2, 3);

最后一次调用无法编译,因为在省略的可选参数之后提供了参数。 (至少我认为这就是它不起作用的原因)

我怎样才能省略可选参数(opt)而仍然能够使用可变长度参数(rest)?

编辑:事实上,对C# 4.0, optional parameters and params do not work together 的回答并不让我满意,因为在多个可选参数的情况下可能存在多种重载组合。

【问题讨论】:

  • IMO 将这两种技术结合起来只会比单独的重载 foo() 方法更令人困惑。
  • @CAbbott 确实如此。我搜索的不够多。
  • 您可以随意编辑它。没有办法干净地做到这一点。我给副本的答案,这个问题是寻求不同答案的副本,远非最佳语法,我没有声称它是。答案已发布为可能的解决方法。

标签: c# params optional


【解决方案1】:

这是代码异味。这样的东西会更好:

public interface IFooSetup
{
    IReadOnlyList<object> Params{get;}
    string Opt{get;}
}

public class FooSetup : IFooSetup
{
    public IReadOnlyList<object> Params { get; set; }
    public string Opt { get; set; }

    public FooSetup()
    {
        Opt = "empty";
        Params = new List<object>();
    }
}

public void Foo(int req, IFooSetup setup)
{
}

您将能够更轻松地模拟隔离您的 Foo 测试,并模拟您的设置。

不过,您应该将可选参数设为强类型,除非您绝对无法在编译时实现它。

【讨论】:

  • 我希望仍然能够在一行代码中调用 foo。
  • Foo(1, new FooSetup(){Opt=":)",Params = new List{new object}});
【解决方案2】:

试试这个

        foo(1);
        foo(1, "something");
        foo(1, "something", 2, 3);
        foo(1, rest: new object[]{2,3 });

【讨论】:

    猜你喜欢
    • 2013-04-18
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多