Suche…


Bemerkungen

Der Prozess der Überlastauflösung wird in der C # -Spezifikation , Abschnitt 7.5.3 beschrieben. Ebenfalls relevant sind die Abschnitte 7.5.2 (Typeninferenz) und 7.6.5 (Aufrufausdrücke).

Wie die Überladungslösung funktioniert, wird wahrscheinlich in C # 7 geändert. Die Designhinweise weisen darauf hin, dass Microsoft ein neues System einführen wird, um festzustellen, welche Methode die bessere ist (in komplizierten Szenarien).

Beispiel für ein grundlegendes Überladen

Dieser Code enthält eine überladene Methode namens Hello :

class Example
{
    public static void Hello(int arg)
    {
        Console.WriteLine("int");
    }
 
    public static void Hello(double arg)
    {
        Console.WriteLine("double");
    }
 
    public static void Main(string[] args) 
    {
        Hello(0);
        Hello(0.0);
    }
}

Wenn die Main- Methode aufgerufen wird, wird sie gedruckt

int
double

Wenn der Compiler zum Zeitpunkt der Kompilierung den Methodenaufruf Hello(0) , findet er alle Methoden mit dem Namen Hello . In diesem Fall findet sie zwei davon. Dann versucht sie herauszufinden, welche der Methoden besser ist . Der Algorithmus zum Bestimmen, welche Methode besser ist, ist komplex, aber es läuft darauf hinaus, "möglichst wenig implizite Konvertierungen wie möglich zu machen".

Im Fall von Hello(0) ist daher für die Methode Hello(int) keine Konvertierung erforderlich, für die Methode Hello(double) ist jedoch eine implizite numerische Konvertierung erforderlich. Daher wird die erste Methode vom Compiler ausgewählt.

Im Fall von Hello(0.0) gibt es keine Möglichkeit, 0.0 implizit in ein int zu konvertieren, sodass die Methode Hello(int) nicht einmal für die Überlastauflösung in Betracht gezogen wird. Nur die Methode bleibt übrig und wird vom Compiler ausgewählt.

"params" wird nicht erweitert, sofern dies nicht erforderlich ist.

Das folgende Programm:

class Program
{
    static void Method(params Object[] objects)
    {
        System.Console.WriteLine(objects.Length);
    }   
    static void Method(Object a, Object b)
    {
        System.Console.WriteLine("two");
    }
    static void Main(string[] args)
    {
        object[] objectArray = new object[5];

        Method(objectArray);
        Method(objectArray, objectArray);
        Method(objectArray, objectArray, objectArray);
    }
}

wird drucken:

5
two
3

Die Method(objectArray) kann auf zwei Arten interpretiert werden: Ein einzelnes Object Argument, das zufällig ein Array ist (das Programm würde also 1 ausgeben, da dies die Anzahl der Argumente oder ein Array von Argumenten wäre, die in der angegeben werden Normalform, als ob die Methode Method nicht das Schlüsselwort params In diesen Situationen hat die normale, nicht expandierte Form immer Vorrang. Das Programm gibt also 5 .

Im zweiten Ausdruck, Method(objectArray, objectArray) , sind sowohl die erweiterte Form der ersten als auch die traditionelle zweite Methode anwendbar. Auch in diesem Fall haben nicht expandierte Formulare Vorrang, daher druckt das Programm two .

Im dritten Ausdruck, Method(objectArray, objectArray, objectArray) , besteht die einzige Option darin, die erweiterte Form der ersten Methode zu verwenden. Das Programm druckt also 3 .

Übergabe von null als eines der Argumente

Wenn Sie haben

void F1(MyType1 x) {
    // do something
}

void F1(MyType2 x) {
    // do something else
}

und aus irgendeinem Grund müssen Sie die erste Überladung von F1 aufrufen, aber mit x = null , dann einfach

F1(null);

wird nicht kompiliert, da der Aufruf mehrdeutig ist. Um dem entgegenzuwirken, können Sie tun

F1(null as MyType1);


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow