Bei der Arbeit habe ich also eine API verwendet, die wir nicht selbst geschrieben haben, und eine der Methoden nahm einen Delegaten. Aus irgendeinem Grund kam mir die Idee, dass ich eine Erweiterungsmethode habe, die zu dieser Signatur passt, und ich fragte mich, ob sie funktionieren würde. Ich war mir sicher, dass es nicht funktionieren würde, aber zu meiner großen Überraschung funktionierte es doch. Erlauben Sie mir, das zu demonstrieren:
Nehmen wir an, ich habe diese Klassen:
public interface IMyInterface
{
}
public class MyClass : IMyInterface
{
}
public static class Extensions
{
public static string FuncMethod(this IMyInterface imy, int x)
{
return x.ToString();
}
}
Nehmen wir an, ich habe irgendwo eine Methodensignatur, die wie folgt aussieht:
private static void Method(Func<int, string> func)
{
}
Meine Erweiterungsmethode (sieht so aus) entspricht dieser Signatur, aber wir alle wissen, dass Erweiterungsmethoden nur Schall und Rauch sind, also ist es wirklich nicht mit dieser Signatur übereinstimmen. Dennoch kann ich dies sicher tun:
var instance = new MyClass();
Method(instance.FuncMethod);
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
nicht, was passiert hier für mich hinter den Kulissen?