Wenn Sie einem int
ein long
zuweisen, passiert nur eine implizite Konvertierung. longOne
ist ein tatsächliches long
(als ob du es initialisiert hättest als 1L
), und nicht ein int
maskiert als long
, wenn du die Drift bekommst.
Das heißt, int
(oder Int32
) und long
(oder Int64
) sind nicht in Bezug auf Vererbung oder Implementierung verwandt; Sie sind zufällig konvertierbar, weil beide ganzzahlige Zahlen sind.
Wenn man sich die Methode in Reflector anschaut, sieht es so aus, als ob diese Methode für die Bestimmung der Vererbung und nicht für die Kompatibilität verwendet werden sollte.
Wenn Sie zum Beispiel eine Klasse haben, die eine Schnittstelle implementiert, dann würde die Methode true zurückgeben, wenn Sie dies getan hätten
(typeof(interface).IsAssignableFrom(typeof(class))
Das IsAssignableFrom
gibt "true" zurück, wenn die Typen identisch sind oder wenn der Typ es implementiert oder erbt.
A long
erbt nicht int
, daher gibt die Methode false zurück.
Wenn Sie einem int
einen Wert long
zuweisen, handelt es sich nicht nur um eine Zuweisung. Der Compiler fügt auch automatisch Code hinzu, um den int
Wert in einen long
Wert zu konvertieren.
Da Type.IsAssignableFrom eine .NET Framework-Funktion ist, ist die Zuweisung von "int" zu "long" eine C # -Sprache. Wenn Sie sich die generierte IL ansehen, sehen Sie dort eine Typkonvertierungsinstruktion. Es gibt viele Orte, an denen sich CLR-Regeln von denen in C # unterscheiden können, ein weiteres Beispiel ist die Überladungsauflösung in MethodBase.Invoke und die von C # -Compiler durchgeführte.
Von Ссылка :
true, wenn c und der aktuelle Type den gleichen Typ darstellen oder wenn der aktuelle Type in der Vererbungshierarchie von c enthalten ist oder wenn der aktuelle Type eine Schnittstelle ist, die c implementiert, oder wenn c ein generischer Typparameter ist und der Der aktuelle Typ repräsentiert eine der Einschränkungen von c. false, wenn keine dieser Bedingungen erfüllt ist oder wenn c null ist.
Wie @BoltClock sagt, ist es nur implizite Konvertierung.