或多或少相等的过载

时间:2010-06-26 20:28:25

标签: c# overloading

以下代码在C#4.0中编译:

void Foo(params string[] parameters) { }
void Foo(string firstParameter, params string[] parameters) { }

编译器如何知道您调用的是哪个重载?如果不能,为什么代码仍然可以编译?

2 个答案:

答案 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,因为它有一个独立的字符串参数,它与调用的唯一/第一个参数相匹配。