具有可选和params值的C#函数

Bru*_*hes 2 c# overloading function

我有这个测试代码:

    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");
    }
Run Code Online (Sandbox Code Playgroud)

func1func2平等?

创建时没有错误func2,但是,当我尝试func2在exec中使用like时(使用可选值),编译器显示错误This function has some invalid arguments.

我认为func1并且func2对于将像API一样使用此功能的人来说是相同的.

这段代码有什么问题?我可以将此方法用于具有可选和params值的函数吗?

Jon*_*eet 10

通常,可选参数必须在方法声明的末尾出现 - 参数数组(例如p此处)是唯一的例外.但是当涉及到使用参数时,编译器将假设所有位置参数与方法声明的顺序相同...因此,如果要使用选项参数数组,则会遇到麻烦.这应该没问题:

func2("a", p: new[] { "p1", "p2" })
Run Code Online (Sandbox Code Playgroud)

但我个人只是避免混合参数数组和可选参数.这显然令人困惑.

我相信C#5规范的相关部分是7.5.1.1,其中包括:

具有以其展开形式调用的参数数组的函数成员的位置参数,其中在参数列表中的相同位置处不发生固定参数,其对应于参数数组的元素.

另见第7.5.3.1节.一切都很复杂......