Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有可选值和参数值的C#函数_C#_Function_Overloading - Fatal编程技术网

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

具有可选值和参数值的C#函数,c#,function,overloading,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 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");
    }
func1
func2
是否相等

当我创建
func2
时没有错误,但是当我尝试在exec中使用
func2
时(使用可选值),编译器显示错误
此函数有一些无效参数

我认为
func1
func2
对于像API一样使用此函数的人来说是平等的

这个代码有什么问题?
对于具有可选值和参数值的函数,我可以使用这种方法吗?

通常可选参数必须位于方法声明的末尾-参数数组(如
p
此处)是唯一的例外。但在使用参数时,编译器将假定所有位置参数的顺序与方法声明的顺序相同。。。因此,如果要使用可选性和参数数组端,就会遇到麻烦。这应该没问题:

func2("a", p: new[] { "p1", "p2" })
但就我个人而言,我只是避免混合参数数组和可选参数。这显然令人困惑

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

函数成员的位置参数对应于参数数组的一个元素,该函数成员的参数数组以扩展形式调用,在参数列表的同一位置没有固定参数


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

我喜欢这个问题。。。但是,在实际编写此类代码之前,请三思而后行——在您刚刚编写代码时,您已经很难解释将调用什么以及如何调用。想象一下,当其他人(甚至两个月后的你)尝试使用它时。。。你真的不想在你的编码准则“总是指定XXXX函数的所有参数,否则你会得到奇怪的错误/不可预测的行为…”中添加注释,好吧,但关于我的第一个问题,
func1
等于
func2
?我看不出有什么区别。@Brunocroysfeltes:你得先定义一下“平等”的含义。它们显然不“相等”,因为
func1
有两个重载,而
func2
只有一个重载。。。