Übergeben einer Erweiterungsmethode an eine Methode, die einen Delegaten erwartet. Wie funktioniert das?

9

Bei der Arbeit habe ich also eine API verwendet, die wir nicht geschrieben haben, und eine der Methoden hat einen Delegierten genommen. Aus dem einen oder anderen Grund kam mir die Idee, dass ich eine Erweiterungsmethode habe, die zu dieser Signatur passt, also habe ich mich gefragt, ob das funktionieren würde. Ich war mir sicher, dass es nicht viel passieren würde, aber zu meiner Überraschung tat es das auch. Gestatten Sie mir Folgendes zu demonstrieren:

Sagen Sie, ich habe diese Klassen:

%Vor%

Nehmen wir an, ich habe irgendwo eine Methodensignatur, die so aussieht:

%Vor%

Jetzt passt meine Erweiterungsmethode (wie es aussieht) zu dieser Signatur, aber wir alle wissen, dass Erweiterungsmethoden nur Rauch und Spiegel sind, also stimmt wirklich nicht mit dieser Signatur überein. Dennoch kann ich das sicher tun:

%Vor%

Meine Frage ist, wie funktioniert das? Was generiert der Compiler für mich um dies akzeptabel zu machen? Die eigentliche Signatur der Extension-Methode nimmt eine Instanz von IMyInterface , aber die Func tut nicht so, was hier hinter den Kulissen passiert?

    
BFree 19.07.2010, 20:37
quelle

2 Antworten

8

Instanzmethoden werden implementiert, indem versteckte this Parameter übernommen werden.

Wenn Sie einen Instanzdelegaten aus einer Erweiterungsmethode erstellen, wird der versteckte this -Parameter als erster normaler Parameter an die Methode übergeben.

Beachten Sie, dass dies Kann nicht mit Werttypen durchgeführt werden .

    
SLaks 19.07.2010, 20:41
quelle
1

Ich weiß nicht genau, was der Compiler tut, um diese Szenarien zuzulassen, aber die Erwartungen scheinen vernünftig. Vielleicht hilft dieses Codebeispiel, das Konzept zu verstehen.

%Vor%     
Amy B 20.07.2010 15:13
quelle

Tags und Links