以下代码在C#4.0中编译:
void Foo(params string[] parameters) { }
void Foo(string firstParameter, params string[] parameters) { }
编译器如何知道您调用的是哪个重载?如果不能,为什么代码仍然可以编译?
答案 0 :(得分:13)
在C#语言规范第7.4.3.2章“更好的功能成员”中详细说明:
否则,如果MP以其正常形式适用且MQ具有params数组且仅适用于其扩展形式,则MP优于MQ
否则,如果MP的声明参数少于MQ,则MP优于MQ。如果两个方法都具有params数组并且仅适用于它们的扩展形式,则会发生这种情况。
Fwiw,C#语言规范是非常可读的文档,可以帮助您自己解决这些难题。您可以在计算机上找到它,并在vc#\ specifications \ 1033子目录中的Visual Studio安装目录(例如c:\ program files \ microsoft visual studio 9.0)中找到它。
另一个好的是Ecma-335标准文件,可以PDF download免费获得。它指定了CLR和JIT编译器的行为,这是理解为什么C#(和CLR)做他们所做的事情的好材料。推荐使用。
答案 1 :(得分:6)
在某些情况下,it will decide for you。因此,您可能希望在这种情况下使用不同的名称(或者在更有用的情况下:-))。
特别是,在这四种情况中:
Foo("bar");
Foo("bar", "bar");
Foo(new string[]{"bar", "bar"});
Foo("bar", new string[] { "bar", "bar" });
只有#1和#2是'模棱两可的'(因为#3和#4分别自然地匹配过载1和2)。
在#1和#2情况下,重载决策选择重载#2,因为它有一个独立的字符串参数,它与调用的唯一/第一个参数相匹配。