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?
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 .
Tags und Links c# extension-methods delegates