2013-02-27 70 views
3

我试图混合可选参数和可变长度参数关键字(使用PARAMS关键字):混合可选参数,而params在c#

这里的函数声明:

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的回答不满足我,因为在多个可选参数的情况下可能有多种重载组合。

+3

组合这两种技术的IMO只是让它比单独的重载'foo()'方法更容易混淆。 – 2013-02-27 14:48:36

+0

@CAbbott确实如此。我没有足够的搜索。 – seb 2013-02-27 15:04:01

+0

您可以尽可能多地编辑它。没有办法做到这一点干净。我给复本的答案是,这个问题是一个重复的问题,正在寻求一个不同的答案,远不是最佳的语法,我也没有声称它是。答案是作为一个可能的工作。 – CodeMonkeyKing 2014-06-06 06:59:27

回答

1

试试这个

 foo(1); 
     foo(1, "something"); 
     foo(1, "something", 2, 3); 
     foo(1, rest: new object[]{2,3 }); 
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测试,并嘲笑你的设置。

尽管如此,除非在编译时绝对无法实现,否则应该使可选参数为强类型。

+0

我想仍然可以在一行代码中调用foo。 – seb 2013-02-27 15:17:07

+1

Foo(1,new FooSetup(){Opt =“:)”,Params = new List {new object}}); – 2013-02-27 15:35:08