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 に答える