Wie werden Erweiterungsmethoden kompiliert?

8

Wie implementiert der C # -Compiler Erweiterungsmethoden?

    
alfdev 14.10.2010, 10:10
quelle

3 Antworten

6

Der Prozess entspricht genau der Überladungsauflösung:

%Vor%

Der Compiler überprüft alle Funktionen mit dem Namen "Func" und versucht, den statischen Typ von myObject mit den Parametern zu vergleichen (möglicherweise unter Verwendung von Konvertierungen, Upcasting zur Basisklasse). Wenn es erfolgreich ist, dann ruft die entsprechende Funktion.

Wenn Sie erkennen, dass Sie die Extensionsmethoden "auf normale Weise" aufrufen können, dann ist es klar:

%Vor%

Für den angegebenen Typ (hier Zeichenfolge) sucht der Compiler nur nach allen statischen Funktionen mit dem Modifikator "this" für das erste Argument und versucht, den statischen Typ auf der linken Seite des. (in diesem Beispiel "a") mit dem Parametertyp in der Funktion.

    
Stefan 14.10.2010, 10:18
quelle
3

Instanzmethoden einer Klasse haben ein verstecktes Argument. Ein Beispiel:

%Vor%

sieht tatsächlich so aus, wenn der JIT-Compiler damit fertig ist, zurück in C # -Syntax konvertiert:

%Vor%

Dieses versteckte Argument ist der Grund, warum Sie this in einer Instanzmethode verwenden können. Der JIT-Compiler ermittelt das Argument, das übergeben werden soll, um die Foo-Methode aufzurufen.

Wie Sie sehen können, handelt es sich jetzt um einen sehr kurzen Sprung zu einer Erweiterungsmethode.

    
Hans Passant 14.10.2010 10:53
quelle
0

Der Compiler sucht zuerst in der Basisklasse nach einer Funktion, die mit der Signatur der Funktion übereinstimmt. Wenn es nicht gefunden werden kann, sucht es nach einer Erweiterung. Wenn eine Erweiterung dieselbe Signatur wie eine Basisklassenmethode hat, wird stattdessen die Basisklassenmethode aufgerufen.

Dies könnte helfen: Erweiterungsmethoden

    
Kenneth Parker 16.04.2013 03:55
quelle

Tags und Links