4

我正在尝试混合可选参数和可变长度参数(使用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 的回答,可选参数和参数不能一起工作并不让我满意,因为在多个可选参数的情况下可能存在多种重载组合。

4

2 回答 2

2

这是一种代码气味。这样的事情会更好:

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 测试,并模拟您的设置。

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

于 2013-02-27T14:57:45.963 回答
2

尝试这个

        foo(1);
        foo(1, "something");
        foo(1, "something", 2, 3);
        foo(1, rest: new object[]{2,3 });
于 2013-02-27T14:53:32.893 回答