我正在尝试混合可选参数和可变长度参数(使用 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)并仍能使用变长参数(其余)?
编辑:事实上,对C# 4.0, optional parameters and params do not work together的回答并不能让我满意,因为在多个可选参数的情况下可能存在多种重载组合。
答案 0 :(得分:3)
这是一种代码味道。这样的事情会更好:
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测试,并模拟您的设置。
仍然,你应该使用强类型的可选参数,除非你在编译时绝对无法实现它。
答案 1 :(得分:1)
试试这个
foo(1);
foo(1, "something");
foo(1, "something", 2, 3);
foo(1, rest: new object[]{2,3 });