Ihre zweite Methode wird aufgerufen, wenn eine exakte Übereinstimmung gefunden wird, wird sie vor den Parametern verwendet.
From MSDN:
Bei Überlastung Auflösung durchgeführt wird, ein Verfahren, mit einem Parameterfeld kann entweder in seiner normalen Form oder in seiner erweiterten Form (Abschnitt 7.4.2.1) anwendbar sein. Die erweiterte Form einer Methode ist nur verfügbar, wenn die normale Form der Methode nicht anwendbar ist und nur dann, wenn eine Methode mit derselben Signatur wie die erweiterte Form nicht bereits im selben Typ deklariert ist.
Ihr Beispiel:
using System;
class Test
{
static void F(params object[] a) {
Console.WriteLine("F(object[])");
}
static void F() {
Console.WriteLine("F()");
}
static void F(object a0, object a1) {
Console.WriteLine("F(object,object)");
}
static void Main() {
F();
F(1);
F(1, 2);
F(1, 2, 3);
F(1, 2, 3, 4);
}
}
Ausgang:
F();
F(object[]);
F(object,object);
F(object[]);
F(object[]);
Dies ist besonders verwirrend für die Menschen, wenn sie F nennen (null). Erhalten Sie F ((object []) null) oder F (neues Objekt [] {null})? Viele Menschen erwarten das letztere, aber da das erstere in der normalen Form anwendbar ist, ist es besser. –
@Eric - Sie hören nie auf, mich mit einer tiefen Rahmenfrage zu überraschen, an die ich nie denken würde ... aber am Ende benutze ich sie in der Praxis Monate später. Einige deiner Antworten hier haben enorme Leistungsunterschiede für mich gemacht, mach weiter so. –
Wenn Sie die von Microsoft veröffentlichte annotierte Spezifikation nicht gelesen haben, sollten Sie, wie Sie meinen, bemerken: Es ist eine Goldmine. – jason