2

私はこのテストコードを持っています:

    void func1(string a, params string[] p)
    {
        func1(a, true, p);
    }

    void func1(string a, bool b, params string[] p)
    {
        //...
    }

    void func2(string a, bool b = true, params string[] p)
    {
        //...
    }

    void exec()
    {
        func1("a", "p1", "p2");
        func2("a", "p1", "p2");
    }

func1func2等しいですか?

を作成してもエラーは発生しませんが、execで(オプションの値を使用して)同様func2のものを使用しようとすると、コンパイラはエラーを表示します。func2This function has some invalid arguments

APIのようにこの関数を使用する人にとっては同じだfunc1と思います。func2

このコードの何が問題になっていますか?オプションの値とparams値を持つ関数にこのアプローチを使用できますか?

4

1 に答える 1

10

通常、オプションのパラメーターはメソッド宣言の最後に配置する必要があります。パラメーター配列(pここなど)が唯一の例外です。ただし、引数の使用に関しては、コンパイラはすべての位置引数がメソッド宣言と同じ順序であると想定します...したがって、オプションパラメータ配列側を使用する場合は問題が発生します。これは大丈夫なはずです:

func2("a", p: new[] { "p1", "p2" })

しかし、個人的には、パラメーター配列とオプションのパラメーターの混合を避けたいと思います。明らかに紛らわしいです。

C#5仕様の関連セクションは7.5.1.1であり、次のものが含まれていると思います。

パラメータリスト内の同じ位置に固定パラメータが発生しない、拡張形式で呼び出されたパラメータ配列を持つ関数メンバーの位置引数は、パラメータ配列の要素に対応します。

セクション7.5.3.1も参照してください。それはすべてかなり複雑です...

于 2013-02-08T17:00:56.217 に答える