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

时间:2013-02-08 16:57:25

标签: c# function overloading

我有这个测试代码:

    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是否等于?

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

我认为func1func2对于像API一样使用此功能的人来说是相同的。

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

1 个答案:

答案 0 :(得分:10)

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

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

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

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

  

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

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