Das Problem ist, dass ein Int kein Objekt ist.
Ein Int kann Box zu einem Objekt sein. Das resultierende Objekt (aka boxed int) ist natürlich ein Objekt, aber es ist nicht mehr genau ein int.
Beachten Sie, dass die "ist" Ich verwende oben ist nicht das gleiche wie der C# -Operator is. Mein "ist" bedeutet "ist umwandelbar durch implizite Referenzkonvertierung". Dies ist die Bedeutung von "ist", wenn wir über Kovarianz und Kontravarianz sprechen.
Ein int ist implizit in ein Objekt konvertierbar, aber dies ist keine Referenzkonvertierung. Es muss verpackt werden.
Ein House
ist implizit in eine Asset
über eine Referenzumwandlung konvertierbar. Sie müssen keine Objekte erstellen oder ändern.
Betrachten Sie das Beispiel unten. Beide Variablen house
und asset
verweisen auf das gleiche Objekt. Die Variablen integer
und boxedInt
haben dagegen den gleichen Wert, beziehen sich aber auf verschiedene Dinge.
House house = new House();
Asset asset = house;
int integer = 42;
object boxedInt = integer;
Boxing and Unboxing ist nicht so einfach wie es aussehen könnte. Es hat viele Feinheiten und kann Ihren Code auf unerwartete Weise beeinflussen. Mischen von Boxen mit Kovarianz und Kontravarianz ist eine einfache Möglichkeit, jemanden zu blenden.
Ich würde eine Antwort posten, aber ich möchte nicht mit dem Wortlaut fummeln. Überprüfen Sie den Blogeintrag von Eric Lippert hier, insbesondere die Kommentare. http://blogs.msdn.com/b/ericlippert/archive/2007/10/19/covariance-and-contravariance-in-c-part-three-member-group-conversion-variance.aspx Es scheint zu sein a Bei Referenztyp "Werte" mit demselben Speicherbedarf, was bei Werttypen nicht der Fall ist. Mit dem gesagt, die DelgateMethod könnte generisch gemacht werden, die dann ints, longs usw. unterstützen würde. –