Nicht zu verstehen Geben.IsAssignableFrom
int i=1;
long longOne=i; //assignment works fine
//...but
bool canAssign=(typeof(long).IsAssignableFrom(typeof(int))); //false
Warum ist canAssign
falsch?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim zuweisen
int
zu einemlong
alle passiert ist, dass eine implizite Konvertierung.longOne
ist eine tatsächlichelong
(als ob Sie initialisiert es1L
), und nicht einint
getarnt als einelong
, wenn Sie bekommen die drift.Dass
int
(oderInt32
) undlong
(oderInt64
) sind nicht verwandt in Bezug auf die Vererbung oder Implementierung; Sie passieren einfach konvertierbar sein, weil beide Integrale Anzahl Arten.Blick auf die Methode, die in den Reflektor scheint es, dass diese Methode sollte verwendet werden, für die Bestimmung, Vererbung eher als Kompatibilität.
Wenn Sie zum Beispiel eine Klasse, die eine Schnittstelle implementiert, dann wäre die Methode gibt true zurück, wenn Sie haben
(typeof(interface).IsAssignableFrom(typeof(class))
Den
IsAssignableFrom
gibt true zurück, wenn die Typen identisch sind, oder wenn der Typ implementiert oder erbt es.Einen
long
Erben nichtint
, so gibt die Methode false zurück.Beim zuweisen
int
Wert auf einelong
, es ist nicht nur eine Zuweisung. Der compiler fügt automatisch den notwendigen code zu konvertieren, dieint
Wert in einelong
Wert.Weil Typ.IsAssignableFrom ist .NET framework-Anlage, bei der Zuweisung von int auf long ist ein C# - Sprache ein. Wenn Sie einen Blick auf die generierte IL du wirst sehen, Typ-Konvertierung Anweisung gibt. Es gibt viele Orte, wo die CLR-Regeln könnten sich von C# lieben, ein weiteres Beispiel ist überlast-Auflösung in MethodBase.Aufrufen und durchgeführt, die von der C# - compiler.
Vom http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx:
Als @BoltClock sagt, es ist nur eine implizite Konvertierung.
var isSameOrChild = baseType.IsAssignableFrom(otherType)