我有这个测试代码:
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
时(使用可选值),编译器显示错误This function has some invalid arguments
我认为func1
和func2
对于像API一样使用此功能的人来说是相同的。
这段代码有什么问题? 我可以将此方法用于具有可选和params值的函数吗?
答案 0 :(得分:10)
通常,可选参数必须在方法声明的末尾出现 - 参数数组(例如p
)是唯一的例外。但是当涉及到使用参数时,编译器将假设所有位置参数与方法声明的顺序相同...所以如果你想使用选项和参数数组端。这应该没问题:
func2("a", p: new[] { "p1", "p2" })
但我个人只是避免混合参数数组和可选参数。这显然令人困惑。
我认为C#5规范的相关部分是7.5.1.1,其中包括:
具有以其展开形式调用的参数数组的函数成员的位置参数,其中参数列表中的相同位置没有固定参数,对应于参数数组的元素。
另见第7.5.3.1节。这一切都很复杂......